触发器应该在每次条件匹配时触发,但在我的例子中没有。
我使用自定义控件创建了一个侧边栏菜单项。其中有一个名为IsActive的属性,它返回一个布尔值。我将此属性绑定到ViewModel中的一个Property。每当IsActive为true时,我希望它将前景色更改为HoverColor属性的颜色,即Primary。如果不是,则保持为Black颜色。
但是它并没有发生,即使IsActive不断地改变它的值,触发器也会按预期工作。但是颜色的Setter只触发一次。更奇怪的是,当我MouseEnter和MouseLeave项目时,颜色会变回黑色,这是我在触发器的条件中根本没有指定的。
下面是代码片段:
MainWindow.cs
<controls:DrawerSidebarMenu
HorizontalAlignment="Left"
ClosedWidth="50"
OpenedWidth="145"
Background="{StaticResource VeryLightGrey}"
Foreground="{StaticResource Primary}"
Padding="12">
<StackPanel>
<controls:DrawerSidebarMenuItem
Kind="Stopwatch"
Text="Timer"
Style="{StaticResource DrawerSidebarMenuItemDefault}"
Command="{Binding NavigateToTimerCommand}"
IsActive="{Binding CurrentViewModel, Converter={StaticResource TimerVMToBoolConv}}"
/>
<controls:DrawerSidebarMenuItem
Kind="ListTask"
Text="Tasks"
Style="{StaticResource DrawerSidebarMenuItemDefault}"
Command="{Binding NavigateToTasksCommand}"
IsActive="{Binding CurrentViewModel, Converter={StaticResource TasksVMToBoolConv}}"
/>
<controls:DrawerSidebarMenuItem
Kind="BarChart"
Text="Stats"
Style="{StaticResource DrawerSidebarMenuItemDefault}"
Command="{Binding NavigateToStatsCommand}"
IsActive="{Binding CurrentViewModel, Converter={StaticResource StatsVMToBoolConv}}"
/>
<controls:DrawerSidebarMenuItem
Kind="Gear"
Text="Settings"
Style="{StaticResource DrawerSidebarMenuItemDefault}"
Command="{Binding NavigateToSettingsCommand}"
IsActive="{Binding CurrentViewModel, Converter={StaticResource SettingsVMToBoolConv}}"
/>
</StackPanel>
</controls:DrawerSidebarMenu>
在DrawerSidebarMenuItem的ControlTemplate中,我定义了如下触发器。
主题/Generic.xaml
<ControlTemplate.Triggers>
<Trigger Property="IsActive" Value="True">
<Setter Property="Foreground" Value="{Binding RelativeSource={RelativeSource Self}, Path=HoverColor}"/>
</Trigger>
</ControlTemplate.Triggers>
下面是它不工作的截图:
此外,这里是IsActive属性不断变化的证据:
如果你需要进一步的调查,我还在我的repo中包含了一个分支上的项目:https://github.com/ihsansfd/extended-pomodoro/tree/stackoverflow
任何帮助将不胜感激!
我试过使用DataTrigger和Property Trigger,它们给出的结果都是一样的。我希望每次它匹配给定的条件时都会触发。
1条答案
按热度按时间lnvxswe21#
据我所知,这就是你想做的:当项目被选中时,你想让项目的前景变成背景色。2你不关心悬停和响应悬停触发。
感谢您提供源代码。
看起来你在做同样的事情,在两个不同的地方,用两种不同的方法。下面是你正在做的事情:
1.您在
DrawerSidebarMenuItem
的代码后面响应悬停事件。您在OnApplyTemplate()
中执行以下操作:1.您正在尝试更改基于触发器的相同参数,您使用自定义转换器进行转换。您可以在主题中执行此操作。
DrawerSidebarMenuItem
组件的通用参数:通过这种利用,发生了以下情况:
1.鼠标进入-〉颜色变为PRIMARY
1.鼠标离开-〉颜色变为黑色
您所需要做的就是删除
OnApplyTemplate()
中的鼠标输入事件侦听器,然后就可以开始了。如果您希望在IsActive = false时颜色变回原来的颜色,请在样式中添加另一个触发器:
在这里你可以输入你的参考你的黑色资源。