2010-07-04 3 views
1

이전에는 텍스트의 일치 부분이 파란색으로 강조 표시되고 나머지 문자열은 정상적인 배경색을 갖는 반면 자동 완성 동작을 구현하는 사용자 지정 콤보 상자를 win 형태로 개발했습니다. 승패 형태에서는 OwerDraw 모드를 사용하여 간단하게 수행 할 수 있습니다. WPF 컨트롤에 대해 비슷한 종류의 작업을 수행해야합니다. WPF에서 컨트롤을 표시하는 방법을 사용자 지정하는 데 사용할 수 있지만 템플릿을 선언적으로 자연이 어떻게 작동하는지 잘 모르겠다 - 텍스트가 컨트롤의 내부 상태를 기반으로 그려진 방식을 변경해야합니다. . 나는 이것을 이해하기 위해 약간의 독서를 할 것임을 알지만, WPF는 큰 주제이기 때문에 어디에서부터 시작해야하는지 알 수 있도록 올바른 방향으로 몇 가지 포인터를 고맙게 생각합니다.WPF의 에뮬레이트 OwnerDraw 컨트롤

답변

0

WPF에서 컨트롤의 모양은 템플릿, 스타일 및 스타일 선택기의 조합으로 수행됩니다. 일부 데이터의 상태 (컨트롤의 내부 또는 외부에있을 수 있음)에 따라 컨트롤의 모양을 변경하려는 경우 스타일 값을이 데이터에 바인딩하고 변경할 때 스타일 값을 바인딩 할 수 있습니다. 컨트롤의 모양이 변경됩니다 (변경 사항을 알리는 알림 메커니즘이있는 경우). 값 변환기 (IValueConverter)라는 유형을 통해 데이터 값을 변환 할 수도 있습니다. 여기, 주요 아이디어를이 간단한 예제이지만

// In a C# class 
public class MyState : INotifyPropertyChanged 
{ 
    public bool IsEmphasized 
    { 
     get { return _isEmphasized; } 
     set 
     { 
      if (_isEmphasized == value) 
      { 
       return; 
      } 

      _isEmphasized = value; 
      OnPropertyChanged("IsEmphasized"); // This is how to notify that the data is updated 
    } 
} 


// A converter 
public class BooleanToBoldConverter : IValueConverter 
{ 
    public Object ConvertTo(Object value) 
    { 
     if (value is bool) 
     { 
      if ((bool)value) 
      { 
       return FontWeights.Bold; 
      } 
      else 
      { 
       return FontWeights.Normal; 
      } 
     } 
    } 
} 

<TextBlock DataContext="{Binding Source={StaticResource myStateInstance}}" 
      FontWeight="{Binding IsEmphasized, Converter={StaticResource BooleanToBoldConverter}}" Text="Text" /> 

, 일부 세부 사항은 생략되어 간단한 예를 들어

, 우리는 기본 데이터 값을 기준으로 텍스트 블록의 텍스트 스타일을 변경할 수 있습니다 우리가 선언적 방식으로 속성 및 스타일에 바인딩 된 데이터 값에서 UI를 실행할 수 있다는 것을 이해해야합니다. 우리는 실제 그림을 그릴 필요가 없습니다.

+0

이 예제에서는 기존 컨트롤 속성을 일부 데이터에 바인딩합니다. 자동 완성 콤보 상자의 예에서는 콤보의 텍스트 상자 (드롭 다운 목록의 항목 제외)의 그리기 동작을 변경해야합니다. 올바른 속성을 가진 기존 위젯이 없으므로 만들 필요가 있습니까? HighlightUpToThisIndex라는 TextBlock 및 정수 속성과 같은 속성일까요? (아래 계속). – Shane

+0

또한 새로운 재사용 가능한 자체 포함 콤보 상자를 만들어야합니다. 기존 양식의 사용자 지정을 위해 상속 된 컨트롤을 만들 수있는 양식을이기십시오. 이 기능은 WPF에서 어떻게 작동합니까? 아마 내가하고 싶은 것은 당신이 묘사 한 것의 단지 더 복잡한 버전이지만 아직 확신 할 수는 없습니다. WPF에 대해 아직 충분히 알지 못한다고 생각합니다. 현재 WPF Control Development Unleashed을 읽고 있습니다. 아마도 도움이 될 것입니다. – Shane

+0

반사경을 사용하여 ComboBox에 대한 코드를 살펴 보았습니다. UI와 관련된 코드는 거의 없기 때문에 코드의 대부분은 동작과 관련이 있습니다. 따라서 코드 카이젠 (codekaizen)에 언급 된 것처럼 동작과 모양이 크게 다릅니다. 그러나 컨트롤이 항상 필요한 세부 수준에서 공개적으로 연결되는 것은 아니기 때문에 기존 컨트롤의 동작을 사용자 지정하는 것이 어려울 수 있다고 생각합니다. – Shane

0

WPF에서 기억해야 할 중요한 점은 페인트 할 때 드로잉 명령을 내리지 않고 렌더링 시스템에 렌더링 할 셰이프의 유형을 알리는 것입니다. 로우 레벨 드로잉을 탐색하고 싶다면 DrawingVisual 클래스를 살펴보십시오. 그러면 WinForms 캔버스에서 드로잉과 비슷한 레벨에서 렌더링 명령을 큐에 넣을 수 있습니다. codekaizen에서 언급했듯이 WPF에서는 이것이 필요하지 않지만, 컨트롤에 캡슐화 할 때 특히 까다로운 사항이 있는지 또는 이러한 컨트롤을 많이 인스턴스화해야하고 더 나은 성능이 필요한지 알고있는 것이 좋습니다.