是否可以在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>
有没有人知道是否可以编写这样的触发器,和/或有关于如何执行此操作的任何提示?
答案 0 :(得分:1)
我会继续提供答案:
不,这是不可能的。
<Triggers>
中的任何内容都需要从TriggerBase
继承。 Taking a look at it您会发现最重要的虚拟方法(GetCurrentState()
和Seal()
)是内部的,因此除非您是Microsoft,否则您将无法修改该行为。