라벨이 RichTextBox인 게시물 표시

AvalonEdit 에서 x,y,length의 단어 highlight

먼저  DocumentColorizingTransformer 를 상속받아 클래스를 하나 만든다. 해당 클래스의 인스턴스는 하나만 만들어 사용해야 함으로 싱글톤이나 static 참조변수로 하나 잡아준다. 그리고, 아래와 비슷한 클래스도 하나 만든다. public   class   Description     {          public   int  col {  set ;  get ; }          public   int  line {  set ;  get ; }          public   int  length {  set ;  get ; }     } ColorizeLine 메소드를 아래와 비슷하게 override한다. protected   override   void  ColorizeLine(ICSharpCode.AvalonEdit.Document. DocumentLine  line)         {              if  (desiredList ==  null )  return ;           ...

WPF RichTextBox 의 기본 단축키 해제

RichTextBox의 Ctrl + I 같은 기본 단축키는 그냥 덮어씌우니 동작이 안되었다. 구글신에게 도움을 요청해서 겨우 찾았다. 아래 코드로 해제시킨후 쓰고자하는 command를 바인딩 한다. =========================아래 ============================== KeyBinding  keyBinding =  new   KeyBinding ( ApplicationCommands .NotACommand,  Key .L,                                                           ModifierKeys .Control);             richTextBoxMain.InputBindings.Add(keyBinding);             keyBinding =  new   KeyBinding ( ApplicationCommands .NotACommand,  Key .I,          ...

WPF RichTextBox 와 Document의 바인딩

MVVM 패턴을 이용해서 View의 TextBox 등에 바인딩은 간단하게 <TextBox Text="{Binding mystring}"/> 이렇게 하면 된다. RichTextBox 도 마찬가지 일것 같지만, 해보면 안된다. 먼저 RichTextBox가 Content를 표현하는 구조를 알아야 되는데, 그건, 다음에 정리하고, 바인딩 하는 방법은 아래와 같다. 먼저 ViewModel 을  DependencyObject 를 상속고 DependencyProperty 를 정의해준다. public class MyViewModel : DependencyObject { public FlowDocument Document { get { return (FlowDocument)GetValue(DocumentProperty); } set { SetValue(DocumentProperty, value); } } public static readonly DependencyProperty DocumentProperty = DependencyProperty.Register("Document", typeof(FlowDocument), typeof(MyViewModel), new PropertyMetadata(OnDocumentChanged)); public void OnDocumentChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) { } } 그 다음 View 의 code-behind 의 생성자에 InitializeComponent(); Binding b = new Binding("Document"); b.Source = richTextBox; b.Mode = BindingMode.OneWay; BindingOperations.SetB...

C# WPF Cross-thread problem

WFP를 이용해서 어플리케이션을 개발중이다. 예외 메시지는 "다른 스레드가 이 개체를 소유하고 있어 호출한 스레드가 해당 개체에 액세스할 수 없습니다." UI를 다른 쓰레드에서 update 할려고 하면 UI를 담당하는 쓰레드가 해당 컨트럴(객체)를 사용하고 있어 접근 할 수가 없다. 이렇게 다른 쓰레드가 사용하는 객체를 다른 쓰레드에서 접근할때 생기는 문제를 Cross-thread라고 한다. 해결방법은 새로만든 쓰레드에서 UI를 update 할때 UI쓰레드에게 할일을 위임해주면 된다. Winform에서는 Invoke 메소드를 이용하고 WPF에서는 Dispatcher.Invoke를 이용하면 된다. 예제는 구글링으로 ~ 구글링은 c# wpf cross thread 등으로 검색하면된다. http://www.google.co.kr/search?gcx=w&sourceid=chrome&ie=UTF-8&q=c%23+cross+thread+wpf+dispatch

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;     ...