XAML 触发器的Setter在WPF中只触发一次

j91ykkif  于 2023-04-03  发布在  其他
关注(0)|答案(1)|浏览(166)

触发器应该在每次条件匹配时触发,但在我的例子中没有。
我使用自定义控件创建了一个侧边栏菜单项。其中有一个名为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,它们给出的结果都是一样的。我希望每次它匹配给定的条件时都会触发。

lnvxswe2

lnvxswe21#

据我所知,这就是你想做的:当项目被选中时,你想让项目的前景变成背景色。2你不关心悬停和响应悬停触发。
感谢您提供源代码。
看起来你在做同样的事情,在两个不同的地方,用两种不同的方法。下面是你正在做的事情:
1.您在DrawerSidebarMenuItem的代码后面响应悬停事件。您在OnApplyTemplate()中执行以下操作:

public override void OnApplyTemplate()
        {
            base.OnApplyTemplate();

            if (HoverColor != null)
            {
                var hoverColor = this.HoverColor;
                var foreground = this.Foreground;

// you set event listeners here
                this.MouseEnter += (object sender, MouseEventArgs e) =>
                {
                    this.Foreground = hoverColor;
                };

                this.MouseLeave += (object sender, MouseEventArgs e) =>
                {
                    this.Foreground = foreground;
                };
            }

        }

1.您正在尝试更改基于触发器的相同参数,您使用自定义转换器进行转换。您可以在主题中执行此操作。DrawerSidebarMenuItem组件的通用参数:

<ControlTemplate.Triggers>
                        <Trigger Property="IsActive" Value="True">
                            <Setter Property="Foreground" Value="{Binding RelativeSource={RelativeSource Self}, Path=HoverColor}"/>
                        </Trigger>
                    </ControlTemplate.Triggers>

通过这种利用,发生了以下情况:
1.鼠标进入-〉颜色变为PRIMARY

  1. IsActive = True -〉颜色变为PRIMARY
    1.鼠标离开-〉颜色变为黑色
    您所需要做的就是删除OnApplyTemplate()中的鼠标输入事件侦听器,然后就可以开始了。
    如果您希望在IsActive = false时颜色变回原来的颜色,请在样式中添加另一个触发器:
<ControlTemplate.Triggers>
                        <Trigger Property="IsActive" Value="True">
                            <Setter Property="Foreground" Value="{Binding RelativeSource={RelativeSource Self}, Path=HoverColor}"/>
                        </Trigger>
                        <Trigger Property="IsActive" Value="False">
                            <Setter Property="Foreground" Value="{StaticResource = whatever resource for your black color, Path=HoverColor}"/>
                        </Trigger>
                    </ControlTemplate.Triggers>

在这里你可以输入你的参考你的黑色资源。

相关问题