2010-08-18 4 views
2

비슷한 질문을하고 해결책을 찾고 싶지만 단순히 ComboBox의 하위 클래스에 대한 조언만으로 충분하지 않습니다. 작은 숟가락으로주세요.WPF ComboBox를 하위 단추로 추가하는 방법

사례 목록에 새 레코드를 추가하기 위해 특별한 comboBox에 추가 버튼이 필요합니다. 오늘 UserControl이 있지만 잘 보이지 않는 및 내보기에 더 많은 컨트롤이 필요합니다, 그래서 사용자 지정 컨트롤을 ComboBox 확장 시도하기 시작했다.

내가 지금까지하지 않았다 ... 나에게 손을 빌려주십시오 ... :)

내 코드 지금까지 :

: generic.xaml을에서

public class ComboBoxWithAdd : ComboBox 
{ 
    static ComboBoxWithAdd() 
    { 
     DefaultStyleKeyProperty.OverrideMetadata(typeof(ComboBoxWithAdd), new FrameworkPropertyMetadata(typeof(ComboBoxWithAdd))); 
    } 
} 

나는 이것을 가지고

<Style TargetType="{x:Type local:ComboBoxWithAdd}" BasedOn="{StaticResource {x:Type ComboBox}}">   
</Style> 
+0

실제로 이것은 'ComboBox'의 하위 클래스가 아닌 사용자 지정 컨트롤에 대한 좋은 상황처럼 들립니다. 왜이 경로를 선택하고 사용자 지정 컨트롤을 향상시키기를 포기한 이유에 대해 자세히 설명해 주시겠습니까? 사용자 정의 컨트롤을 서브 클래 싱하는 것은 어떻습니까? – FrustratedWithFormsDesigner

+0

@Frustrated - ComboBox에서 파생 된 클래스는 사용자 정의 컨트롤입니다. 당신이 조언하고 있는게 뭐지? –

+0

@ John Bowen : 죄송합니다. 더 구체적으로 말하자면, 저는 'Control'의 하위 클래스이고 폼 디자이너를 통해 모양과 레이아웃이 조작되는 클래스라는 의미에서 사용자 정의 컨트롤을 의미했습니다. 내가 잘못 본 것이 아니라면 VisualStudio는 보통 이러한 클래스 인 UserControls를 호출합니다. – FrustratedWithFormsDesigner

답변

4

사용자 지정 컨트롤을 만들기로 결정할 때 실제 동작을 추가할지 아니면 UI 만 추가할지 결정해야합니다. ControlTemplate을 사용자 정의하면 버튼을 추가 할 수 있습니다. ComboBox에서 컨트롤을 파생시키기 시작한 방향을 가리키는 ComboBox의 Items를 업데이트하는 동작을 발생시키는 버튼을 원하는 것처럼 들립니다. 코드와 XAML 측면에 몇 가지 사항을 추가해야합니다. 스타일에서 ControlTemplate에 대한 Setter를 추가하고 ComboBox의 기본 템플릿 사본으로 시작해야합니다 (보통 Blend와 함께이 작업을 수행하지만 그 밖의 다른 소스가 있습니다). 그런 다음 템플릿에서 원하는 곳에 새 Button을 추가 할 수 있습니다.

<Style TargetType="{x:Type local:ComboBoxWithAdd}"> 
    <Setter Property="Template"> 
     <Setter.Value> 
      <ControlTemplate TargetType="{x:Type local:ComboBoxWithAdd}"> 
       ... copy of default template with your modifications 
      </ControlTemplate> 
     </Setter.Value> 
    </Setter> 
</Style> 

는 몇 가지 방법이 버튼을 연결할 수 있지만, 가장 강력한 당신이 당신의 제어 코드에 결합 할 수 명령을 사용하는 것입니다있다. 나중에 자신의 RoutedCommand를 제어 코드에 선언 할 수 있지만 내장 된 것을 사용하기 만하면됩니다.

public ComboBoxWithAdd() 
{ 
    CommandBindings.Add(new CommandBinding(ApplicationCommands.New, NewExecutedMethod)); 
} 

그런 다음 NewExecutedMethod는 당신이 항목을 추가 할 수있는 실제 작업을 수행 할 어떤 논리 추가에 (아마도 콤보 상자의 항목/ItemsSource 작업). 버튼을 연결하려면 Command="ApplicationCommands.New"을 설정하십시오. 사용자 정의 컨트롤을 사용하여 수행 할 수있는 작업은 훨씬 더 많습니다.하지만이 작업을 시작해야합니다.

+0

이것이 내가 얻을 수있는 최선의 대답이라고 생각하지만 ComboBox 템플릿이 현재 내 머리에 너무 복잡하다는 것을 알고 있습니다. 나는 포기하지 않고 다른 것들을 계속 사용하고 나중에 다시 시도 할 것입니다. – rozon

+0

rozon, 내 대답은 아래 참조하십시오. – Falcon

0

하나 이상의 단추를 추가하여 만든 UserControl을 사용하고 사용자 컨트롤을 만들고 필요한 이벤트와 명령을 표시하도록 그룹화했습니다.

사용자 지정 컨트롤을 사용하지 않는 것이 좋습니다.

하지만, 이와 같은 요구 사항이있는 경우. 여기에 우리가 간다 : 1) 당신은 당신이 능력을 확장하려고하는 것에 대한 컨트롤을 파생해야합니다. 2) 컨트롤의 기본 템플릿을 만들어야합니다. [Generic.Xaml]

나머지는 사용자 정의입니다. 하지만, 한 가지 장점은 쉽게 Skinnable 컨트롤을 얻을 수 있다는 것입니다.

HTH

1

Rozon는, 당신은 복잡한 템플릿을 생성하지 않고 뒤에이 같은 코드에서 콤보 상자를 조작 할 수 있습니다 :

public class CustomComboBox : ComboBox 
{ 
    public override void OnApplyTemplate() 
    { 
     base.OnApplyTemplate(); 
     Grid grid = WpfHelper.FindAllChildrenByName<Grid>(this, "MainGrid").SingleOrDefault() as Grid; 
     if (grid != null) 
     { 
      grid.ColumnDefinitions.Add(new ColumnDefinition()); 
      Button button = new Button(); 
      button.Content = "test"; 
      button.SetValue(Grid.ColumnProperty, 2); 
      grid.Children.Add(button); 
     } 
    } 
} 

WpfHelper 그 이름하여 시각적 자식을 발견 단지 클래스입니다.콤보 상자의 표준 컨트롤 템플릿이 변경되고 MainGrid의 이름이 변경되면 쉽게 손상 될 수 있습니다.

+0

차가움. 나는 지금까지 WpfHelper를 몰랐다. 나는 이것이 어떻게 쉽게 깨질 수 있는지를 볼 수 있지만, 나는 또한 그 기능에 대한 몇 가지 다른 용도를 생각할 수있다. 감사! :) – rozon

+1

나는 당신이'var grid = GetTemplateChild ("MainGrid")를 Grid로 할 수 있다고 생각한다. WpfHelper에 접근 할 수 없다면. –

관련 문제