2010-05-13 9 views
9

WPF 텍스트 상자에서 텍스트의 여러 부분을 선택할 수 있습니까? 예를 들어, 문자열이 THIS IS A TEST 인 텍스트 상자의 경우 THIS을 강조 표시 한 다음 Ctrl 키를 누른 상태에서 TEST을 강조 표시하고 THIS을 선택 취소하지 않고 강조 표시 할 수 있습니다.WPF 텍스트 상자에서 여러 텍스트 세그먼트를 선택하려면 어떻게해야합니까?

내가 원하는 대상에 대한 시각적 단서는 Firefox의 기능에 대한 this 문서를 참조하십시오.

기본적으로이 작업을 수행 할 방법이 없으면 WPF에서 구현 된 타사 컨트롤이 있는지 알고 싶습니다.

답변

13

WPF의 텍스트 상자와를 RichTextBox 클래스를 직접 다중 선택을 지원하지 않지만 WPF의 대부분의 지역과 마찬가지로이이 능력을 얻기 위해 기존하여 RichTextBox를 사용자 정의하기가 매우 쉽습니다.

단계는 다음과 같습니다

  • 추가하여 RichTextBox
  • 에서 현재 TextSelection 제외한 모든 선택 범위를 포함 할 유형 ObservableCollection<TextRange>의 "AdditionalRanges"속성을 클래스 유도 만들기
  • 재정 OnPreviewMouseLeftButtonDown : 만약 Ctrl 키 현재의 TextSelection을 "AdditionalRanges"속성에 결합하고 Selection을 지우십시오. 그렇지 않으면 "AdditionalRanges"를 지 웁니다.
  • 생성자에서 처리기를 을 사용하는 "AdditionalRanges"에 추가하여 컬렉션의 추가 된 범위가 하이라이팅되고 제거 된 범위가 정상적으로 표시되도록합니다. AdditionalRanges와 TextSelection
  • 바인드 가능 "텍스트"속성
  • 을 결합

    • 에 "AllRanges"속성 : 구현에서

  • 나는 또한 편의를 위해 몇 속성을 구현하는 것이 좋습니다 바인딩 할 수있는 "SelectedText"속성

이들은 모두 구현하기가 쉽지 않습니다.

최종 참고 : TextSelection 기존 AdditionalRange 겹치는 경우

  • AdditionalRanges를 업데이트하거나 AllRanges 컴퓨팅, 그렇지 않으면 목록에 TextSelection를 추가 결합 범위로 교체하십시오.
  • 당신은 "텍스트"속성을 업데이트 할 때 알아야 할 TextChanged 핸들러를 추가 할 수 있습니다, 그리고 PropertyChangedCallback는 FlowDocument
를 업데이트 할 때 알고
2

표준 WPF TextBox는 이러한 동작을 지원하지 않습니다. 그래서 그 기능을 얻으려면 볼 수있는 유일한 방법은 자신의 텍스트 상자 컨트롤 (어쩌면 표준 텍스트 상자 ControlTemplate 기반) 구현하는 것입니다.

환호, 알렉스

관련 문제