WPF 이미지위에 라인 그리기(WPF DrawLine on exist Image)

WPF 기초가 부족해 삽질 한참 하다가 별것 아닌 방법으로 해결했다. 처음엔 Canvas위에 그릴려고 Canvas객체를 가져왔는데 WinForm 처럼 Graphics를 가져올수 없었다. 구글링해보면 제목은 WPF이고 Graphics를 가져와 그걸로 그리는 예제가 있어서 쉽게 끝날줄 알았는데, 한참 헤매었다. 답은 간단하다. 캔버스에서 이미지 다음에 객체를 추가하면 끝난다.(허무했다 ㅠ ) <Canvas Name="myCanvas">     <Image ImageSource="....."/>     <Line X1="10" Y1="10" X2="100" Y2="200" /> </Canvas> 동적으로 추가하는  코드도 마찬가지다  myCanvas.Children.Add( new Line{X1=10,Y1=10,X2=100,Y2=200} ); ViewModel로 바인딩해서 많은 선을 그렸었는데 역시 마찬가지로 이미지다음에 Template을 추가해 바인딩 해놓으면 쉽게 된다.

WPF RichTextBox 에서 대문자만 입력가능한 것처럼 보이게

아무리 찾아봐도 RichTextBox 에서 입력 마스크가 없다. AvalonControlLibray에 MaskedTextBox가 있어서 사용해봤는데 답이 안되었다. 구글링하다가 비슷한 코드를 발견하고 수정했다. richTextBox2_TextChanged가 현재 핸들러이다.             RichTextBox _rtbEdit = sender as RichTextBox;             _rtbEdit.TextChanged -= richTextBox2_TextChanged;                         string sPrev = _rtbEdit.Selection.End. GetTextInRun(LogicalDirection. Backward);             int i;             for (i = sPrev.Length - 1; i > -1; i--)             {                 if (Char.GetUnicodeCategory( sPrev[i]) != UnicodeCategory. NonSpacingMark) break;             }             if (i == -1) return;             // replace target character...

Model-Model of View-View(MVVM) Pattern

디자인 패턴중 하나인 MVC는 1979년에 그 개념이 나왔다.(1980년이가?) 2004년 마틴파울러가 PM 패턴을 말하였고,  그후 MVP(Model-View-Presenter) 패턴, MVVM 패턴이 나왔다. 10여년전에 CGI/C를 이용해 웹페이지를 만들때 View를 분리해보았다. 함수포인터를 이용해 View를 교체하였는데... 그때가 즐거웠다. ㅋ  또.. 주제하고는 관련없는 ...  MVVM패턴은 구글에서  mvvm 하면 관련 자료가 많이 나온다. 먼저 msdn 자료( http://msdn.microsoft.com/ko-kr/magazine/dd419663.aspx )와  codeproject 자료( http://www.codeproject.com/KB/WPF/MVVMQuickTutorial.aspx ) 가 정리가 잘되어있었다. 이해할 수 있을만큼 예제와 설명이 있다. 역할을 정리해보면 ... View : User Interface 이다. data를 표현해준다. user와 interaction한다.  ViewModel : View에서 필요한 데이터와 사용자 입력에서 model과 관계를 처리한다. Model : Data와 Buisiness logic 을 처리한다. Model은 ViewModel의 존재를 모르고, ViewModel은 presenter에서 처럼 view의 참조는 필요없다.  WPF의 이벤트(Event) 시스템을 이용해, ViewModel에서 데이터 변경이 일어날때 View는 해당 이벤트를 수신하여 View를 다시 랜더링한다.  이때 WPP에서 View는 보통 xmal로 작성되며 DataContext 를  ViewModel로 참조, 바인딩된다. 데이터의 validate는 Model이 담당하며 ViewModel은 View의 추상화이다.  MVVM은 WPF에서 좀더 특화된 PM패턴이라고 위 msdn링크에서는 말하고 있다. ...

WPF RichTextBox 에서 현재 라인번호

최근 닷넷 프로젝트를 진행중이다. UnityContainer와 MVVM 패턴을 적용하기 위해 MVVM 패턴 학습중인데, 이전에 Spring을 이용해 Web 프로젝트를 해봐서, DI(Dependency Injection), IoC(Inversion of Control) 등 개념을 알고 있어 UnityContainer 는 대충 사용하는데, MVVM 은 Web에서 MVC와 MVP 의 차이점이 명확하게 개념이 잡히질 않는다. 어쨋든.. 오늘 블로깅할건 RichTextBox에서 당연히 라인번호를 가져올 수 있을지 알았는데 한참 뒤져도 없었다. 결국 구글링해보고 참고해서 아래 코드를 작성하였다. /// <summary> /// RichTextBox 의 현재 캐럿의 라인번호를 리턴한다. /// </summary> /// <param name="rtb"></param> /// <returns > int </returns> private int GetLineNumber( RichTextBox rtb) {         TextPointer caretLineStart = rtb.Caretposition.GetLineStartPosition(0);          TextPointer tp = rtb.Document.ContentStart.GetLineStartPosition(0);         int lineNumber = 1;         if (caretlineStart.CompareTo(tp) < 0)        {                 return lineNumber;     ...

진저브래드

이미지
갤스에 진저브래드 올리는 중이다. 5월 17일부터 가능했다고 하는데 18일(어제)봤다. 백업도 해야되고, 펌 다운로드 시간도 오래걸려서 오늘로 미루었다. 먼저 다운속도와 기타 여러문제를 사전에 수집하고자 고수들이 모이는 맛클로 갔다. ㅋ 역시 모비순정이 토렌트로 올라와있고, T맵도 벌써 올라와있었다. 백업은 Kied 가 편리해서 루팅해서 한번에 백업 받았다. 기타 가계부(?)나 자주사용하는 앱들 데이터는 몇개만 골라서 받았다. 전화번호부와 메모등은 Kies를 이용해서 백업했다. Odin을 실행하고 갤스 다운로드모드로 진입하기위해 볼륨다운키+홈키+전원키 를 눌러주었다. (참고: 밧데리 표시가 화면에 나올때 눌려주는게 쉬움, 화면 꺼져있을때는 밧데리 표시만 나오고 부팅만 될수 있음) 공장초기화 메뉴가 나왔다. 젝1 ㅡㅡ; 아... 홈키+전원 키였나??? 어찌되었든 다시 부팅되버리고 한참을 기다렸다. 귀찮아서 그냥 sdk에 있는 adb 를 이용해서 부팅시켰다. ( adb reboot download ) 오딘으로 모비펌을 업로드했다. (PDA를 클릭해 펌 선택, Start 로 업로드) 끝나면 자동으로 부팅되고 계정설정 화면으로 넘어간다. 이제 복구해야겠다. 아.. 귀찬어... 빨라졌을까?? 기대된다.

Android Debug 시 cursor.moveToNext()

디버깅을 하는데 데이터를 몇개 넣어봤는데, 이상하게 정확하게 나오질 않는다. 그래서 , eclipse에서 cursor의 moveToNext() 식을 watchlist에 넣었다. 혹시나 이런 바보같은 일을 되풀이 할까 두렵다. ㅋ watchlist는 메소드를 실행한 결과를 가져오기 때문에 커서의 포인터가 다음으로 이동해버린다. 그래서, 실제로 코드가 실행하면서 커서가 이동하고, watchlist 값을 평가할때 커서가 이동하기때문에 값이 정확하게 나오지 않던것이다. 정확히 커서값을 보며 확인한 결과는 아니지만, 거의 확실하다.(귀찮아서 테스트 안함) 보통 adapter로 해결되지만 가끔 curosr를 사용하고 디버깅할때는 주의해야겠다.

Android Activity 의 lifecycle

이미지
Activity 의 상태에 대한 이해하기 쉬운 그림이다. (구글 이미지 검색으로 퍼왔음) Activity의 상태는 Foreground, Background, 그리고 일부분만보이는 Foreground 상태 3가지가 있다. Foregorund 상태 는 onStart() 이후부터 onStop() 사이이다. 이중 onResume()과 onPause() 사의 상태가 실제로 사용자의 입력을 받을수 있는 Foreground상태이고, onStart()이후와 onStop()이전은 일부분만보이는Foreground상태 (실제로 일부분이 보이거나, 보이지 않을수 있음. 非foreground 상태라고 함)이다. 경고를 표시할때 등, 다이얼로그 박스가 화면에 뿌려지면 非Foreground상태이다. Background상태 는 화면에 보이지 않는다. 보통 onCreate()에서 보통 자원 획득과 초기화를 수행하고, onDestroy()에서 자원을 정리/반납한다. 그래서, 앱을 실행할때 화면에 바로 뜨지 않거나, 종료후에도 실행되는 경우를 볼 수 있다. Activity의 state가 바뀔때마다 해당 메소드를 override 함으로써, 상태변화때 적절한 행동을 할수 있다. 보통 onResume()을 override할때 화면을 다시 그려주고 , pause상태에서는 메모리가 모자랄경우 해당 앱을 죽어버리므로 onPause() 메소드에 상태를 저장하는 코드를 작성한다.