WPF分层触发器

时间:2016-06-24 16:56:15

标签: c# .net wpf triggers

是否可以在WPF中编写可以分层次评估的自定义触发器?

更新:在此示例中,我使用了主题,但根据初始评论,似乎我必须澄清我要求实现主题的方法WPF中的支持 - 它正在编写自定义触发器和这里感兴趣的层次触发器的抽象概念,作为MultiTrigger的替代

在代码中你会写

if (theme == Themes.Black){
    if (IsMouseOver)
       Background = Brushes.Cyan;
    if (IsSelected)
       Background = Brushes.Red;
}
if (theme == Themes.White){
    if (IsMouseOver)
       Background = Brushes.Black;
    if (IsSelected)
       Background = Brushes.Grey;
}

然而,当用触发器表达这种逻辑时,你必须创建一组MultiTriggers

<MultiTrigger>
    <MultiTrigger.Conditions>
        <Condition Property="Theme" Value="Black">
        <Condition Property="IsMouseOver" Value="True">
    </MultiTrigger.Conditions>
    <Setter Property="Background" Value="Cyan" />
</MultiTrigger>
<MultiTrigger>
    <MultiTrigger.Conditions>
        <Condition Property="Theme" Value="White">
        <Condition Property="IsMouseOver" Value="True">
    </MultiTrigger.Conditions>
    <Setter Property="Background" Value="Black" />
</MultiTrigger>
// And so on...

对于复杂的控件,这很快变得无法管理,所以我试图想象一种方法来美化它,并提出了以下语法的想法:

<HierarchicalTrigger Property="Theme" Value="Black">
    <HierarchicalTrigger.Triggers>
         <Trigger Property="IsMouseOver" Value="True">
           <Setter Property="Background" Value="Cyan" />
         </Trigger>
         <Trigger Property="IsSelected" Value="True">
           <Setter Property="Background" Value="Red" />
         </Trigger>
    </HierarchicalTrigger.Triggers>
</HierarchicalTrigger> 

<HierarchicalTrigger Property="Theme" Value="White">
    <HierarchicalTrigger.Triggers>
         <Trigger Property="IsMouseOver" Value="True">
           <Setter Property="Background" Value="Black" />
         </Trigger>
         <Trigger Property="IsSelected" Value="True">
           <Setter Property="Background" Value="Grey" />
         </Trigger>
    </HierarchicalTrigger.Triggers>
</HierarchicalTrigger> 

有没有人知道是否可以编写这样的触发器,和/或有关于如何执行此操作的任何提示?

1 个答案:

答案 0 :(得分:1)

我会继续提供答案:

不,这是不可能的。

<Triggers>中的任何内容都需要从TriggerBase继承。 Taking a look at it您会发现最重要的虚拟方法(GetCurrentState()Seal())是内部的,因此除非您是Microsoft,否则您将无法修改该行为。