2010-08-18 64 views
2

我看到了类似的问题,希望有一个解决方案,但仅仅给一个建议子类组合框对我来说是不够的。我需要它在小汤匙...如何继承一个WPF组合框来添加一个额外的按钮

这种情况下,我需要一个额外的按钮在我的特殊组合框添加新的记录到项目列表。我今天把它作为一个UserControl,但它看起来不太好,我需要对视图进行更多的控制,所以我开始制作一个自定义控件来试图扩展ComboBox。

我没有走远......请帮我一把... :)

到目前为止我的代码:

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

在Generic.xaml我有这样的:

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

实际上,这听起来像是一个自定义控件的好场景,而不是'ComboBox'的子类。你能否更详细地解释为什么你选择了这条路线并放弃增强自定义控制?如何继承自定义控件? – FrustratedWithFormsDesigner 2010-08-18 18:06:20

+0

@Frustrated - 你从ComboBox派生的类是一个自定义控件。你建议什么? – 2010-08-18 18:13:28

+0

@John Bowen:对不起,更具体地说:我的意思是一个自定义控件,它是一个Control类的子类,它的外观和布局通过表单设计器来操作。如果我没有弄错,VisualStudio通常会调用这些类UserControls。 – FrustratedWithFormsDesigner 2010-08-18 18:20:15

回答

4

当决定创建自定义控件时,您需要确定是否需要添加实际行为或只需添加UI。只需添加一个按钮即可自定义ControlTemplate。这听起来像你想要一个按钮,导致一个动作,将更新组合框的项目,这将指向你从ComboBox派生控制的方向。您需要在代码和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,但只需使用内置的RoutedCommand即可。

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

然后在NewExecutedMethod只需添加你想要做的实际行动,以增加项目的任何逻辑(可能具有ComboBox的项目/的ItemsSource工作)。连接按钮只需设置Command="ApplicationCommands.New"。使用自定义控件还有很多可以实现的功能,但这应该让你开始。

+0

我认为这是我能得到的最好答案,但我意识到ComboBox模板在这个时候对我的头来说太复杂了。我没有放弃,但继续与其他的东西,并会在稍后再试一次。 – rozon 2010-08-20 05:20:34

+0

rozon,请参阅下面的答案。 – Falcon 2011-04-04 07:11:45

0

我建议你使用你通过添加一个按钮来创建的UserControl,并将它们分组来做一个用户控件并公开所需的事件和命令。

自定义控件不可取。

但是,如果你有这样的要求。在这里,我们去: 1)你需要得到你想要扩展能力的控制。 2)您需要为控件创建一个默认模板。 [Generic.Xaml]

休息是您的定制。 但是,一个好处是你可以得到一个容易的皮肤控制。

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 2011-04-05 19:41:43

+1

我认为你也可以'var grid = GetTemplateChild(“MainGrid”)作为Grid;'如果你没有访问WpfHelper的话。 – 2012-03-01 21:08:58

相关问题