WPF - 当 MenuItem 链接到的页面处于活动状态时(而不是在 MouseOver 时)更改其背景颜色

WPF - Change background color of MenuItem when the page it links to is active (not when MouseOver)

提问人:ElectricFrankincense 提问时间:9/18/2023 最后编辑:CraigElectricFrankincense 更新时间:9/18/2023 访问量:29

问:

如果 MenuItem 链接到的页面是我当前所在的页面,我想在 WPF 中更改它的背景颜色。我已经弄清楚了如何在 MouseOver 时更改 MenuItem,并认为对于活动页面来说,这将是一个类似的过程。不幸的是,我在搜索此问题时在此处看到的所有链接都解决了 MouseOver 的问题,而不是活动页面的问题。

我正在考虑在代码隐藏中设置“IsFocused”触发器,但这似乎不起作用,因为 IsFocused 是只读的,我不确定这是否是正确的属性。

<StackPanel Name="spMainNav">
    <StackPanel.Resources>

        <ControlTemplate x:Key="VsMenuSub" TargetType="MenuItem">
            <StackPanel>
                <Label Content="{TemplateBinding Header}"  Foreground="White" />

                <StackPanel.Style>
                    <Style TargetType="StackPanel">
                        <Style.Triggers>
                            <Trigger Property="IsMouseOver" Value="True">
                                <Setter Property="Background" Value="Red" />
                            </Trigger>

                            <!--Don't know where to set this in code-behind?-->
                            <Trigger Property="IsFocused" Value="True">
                                <Setter Property="Background" Value="DarkRed" />
                            </Trigger>
                        </Style.Triggers>
                    </Style>
                </StackPanel.Style>
            </StackPanel>
        </ControlTemplate>
            
    </StackPanel.Resources>

    <MenuItem Name="ProjectList" Header="Project List" Template="{StaticResource VsMenuSub}" Click="ProjectList_Click" />
    <MenuItem Header="About" Template="{StaticResource VsMenuSub}" Click="About_Click" />
    <MenuItem Header="Exit" Template="{StaticResource VsMenuSub}" Click="Exit_Click" />
</StackPanel>

我能够修改活动链接的标题文本(在开头附加两个星号)。我以为我可以这样设置背景颜色,但我不知道该怎么做。将 MenuItem 的 Background 字段设置为画笔不起作用。

Public Shared Sub HighlightMenuItem(sender As MenuItem)

    Dim sp As StackPanel = sender.Parent

    Dim bc As New BrushConverter
    sp.Background = bc.ConvertFrom("#36637C")

    Dim thisMI As MenuItem = sender
    Dim controlCount As Integer = VisualTreeHelper.GetChildrenCount(sp)

    For i As Integer = 0 To controlCount - 1
        Dim c = VisualTreeHelper.GetChild(sp, i)

        If TypeOf c Is MenuItem Then
            Dim mi As MenuItem = c

            If mi.Header = thisMI.Header Then
                mi.Header = "** " & mi.Header

                ' This doesn't work
                mi.Background = Brushes.Blue
            End If

        End If
    Next
End Sub
WPF vb.net MenuItem 鼠标悬停

评论


答: 暂无答案