2009-09-29 107 views
14

我正在创建一个简单的自定义控件,该控件从切换按钮延伸,允许用户直接在XAML中指定选中和未选中的内容。它工作的很好,但它基于触发器,我不知道如何定义触发器,除了风格。如果我定义了样式,那么我会失去任何设置在自定义控件之外的东西。如何在不覆盖现有样式的情况下将触发器添加到WPF自定义控件?

我希望能够做的只是将此触发器附加到控件上其他位置的任何现有样式。

这是样式/触发器的XAML。

<ToggleButton.Style> 
    <Style TargetType="{x:Type ToggleButton}" BasedOn="{StaticResource {x:Type ToggleButton}}"> 
     <Setter Property="Content" Value="{Binding RelativeSource={RelativeSource Self}, Path=UncheckedContent}" /> 
     <Style.Triggers> 
      <Trigger Property="IsChecked" Value="True"> 
       <Setter Property="Content" 
         Value="{Binding RelativeSource={RelativeSource Self}, Path=CheckedContent}" /> 
      </Trigger> 
     </Style.Triggers> 
    </Style> 
</ToggleButton.Style> 

我试图通过继承的支持算法FMP的风格的默认类型,但如果自定义控件有一个明确的风格,其母公司设置将无法正常工作。我也考虑过EventTriggers,但我不相信会有事件来初始化控制。

感谢任何人可以提供的帮助。 :)

回答

17

只是为了清除这里的术语:A 用户控件是从UserControl类派生的控件。如果我理解你的话,你从ToggleButton派生出来添加UncheckedContent和CheckedContent属性。在这种情况下,您创建了一个自定义控件。如果我们同意通用术语,总是会更容易遵循:)

据我所知,您不能在XAML中执行这样的泛型样式继承。你总是必须明确指定另一种风格的基础。您的样式可以基于ToggleButton的默认样式或特定的其他样式。如果你不能建立一个尊重它的样式继承链,这种方法将无法工作。

但是既然你有一个自定义控件,你能不能为它写一个基于默认切换按钮样式的默认样式?

<Style TargetType="{x:Type CustomToggleButton}" 
     BasedOn="{StaticResource {x:Type ToggleButton}}"> 

然后,只要将显式样式应用于切换按钮,就可以指定它基于默认的切换按钮样式。

此外,您可以为Themes \ Generic.xaml中包含上述触发器的新切换按钮编写一个(默认)控制模板。在混合中,您可以获得切换按钮的默认模板(“编辑模板” - >“编辑一个副本”)的副本,以确保切换按钮看起来与正常切换按钮完全相同。然后将上面的触发器合并到该模板中。

顺便说一句:你不必创建一个新的控件来添加新的属性。您可以使用attached properties将新属性添加到现有控件。它们可以像普通属性一样从XAML中使用。

+0

感谢您的意见,这非常有帮助。我走了一条不同的路线,并将代码中的现有风格扩展到后面,以添加我的触发器而不破坏现有的风格。您建立的BasedOn建议我已经尝试过,如果设置了明确的样式,则不起作用。我从你的想法中得到了答案,所以我将其标记为答案。 附加的属性理念非常好,我也做了这个改变,谢谢。 :) – 2009-10-02 19:25:45

+1

你介意发布一些你做过的细节吗?我想要做同样的事情。 – stone 2010-08-04 20:02:04

+0

这只是为我节省了很多代码。谢谢! – MattS423 2015-04-15 19:26:20

相关问题