程序问答   发布时间:2022-06-01  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了WPF 菜单 - 允许在禁用的菜单项中启用特定控件大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

如何解决WPF 菜单 - 允许在禁用的菜单项中启用特定控件?

开发过程中遇到WPF 菜单 - 允许在禁用的菜单项中启用特定控件的问题如何解决?下面主要结合日常开发的经验,给出你关于WPF 菜单 - 允许在禁用的菜单项中启用特定控件的解决方法建议,希望对你解决WPF 菜单 - 允许在禁用的菜单项中启用特定控件有所启发或帮助;

我有一个绑定到模型集合的菜单。 MenuItem 命令绑定到模型命令。

我重新定义了 SubMenuItem 控件模板以在其中添加一个 Togglebutton。 此 Togglebutton 允许用户将 MenuItem 指定为“收藏夹”。我希望始终启用此 Togglebutton。

 <ControlTemplate x:Key="{x:Static MenuItem.SubmenuItemTemplateKey}" targettype="{x:Type MenuItem}">
    <GrID x:name="PART_Conteneur" BACkground="transparent">
        <GrID.columnDeFinitions>
            <columnDeFinition WIDth="auto" SharedSizeGroup="Star" />
            <columnDeFinition WIDth="*" />
        </GrID.columnDeFinitions>
        <Togglebutton x:name="PART_Starbutton" Style="{Dynamicresource VerticalToolbarMenuStarTogglebuttonStylE}" VerticalAlignment="Center" margin="2,0" />
        <border x:name="border" borderThickness="1" GrID.column="1" padding="0,2,2">
            <GrID>
                <GrID.columnDeFinitions>
                    <columnDeFinition WIDth="auto" SharedSizeGroup="Icon" />
                    <columnDeFinition WIDth="*" />
                    <columnDeFinition WIDth="auto" SharedSizeGroup="Shortcut" />
                    <columnDeFinition WIDth="13" />
                </GrID.columnDeFinitions>
                
                <ContentPresenter x:name="Icon" margin="6,6,0" VerticalAlignment="Center" GrID.column="0" Contentsource="Icon" WIDth="20" />
                <ContentPresenter x:name="headerHost" GrID.column="1" Contentsource="header" RecognizesAccessKey="True" VerticalAlignment="Center" />
                <TextBlock x:name="inputGestureText" GrID.column="2" Text="{TemplateBinding inputGestureText}" margin="5,2" DockPanel.Dock="Right" />
            </GrID>
        </border>
    </GrID>
    
    <ControlTemplate.triggers>
        <trigger Property="buttonBase.Command" Value="{x:Null}" />
        <trigger Property="Icon" Value="{x:Null}">
            <Setter Targetname="Icon" Property="Visibility" Value="HIDden" />
        </trigger>
        <trigger Property="IsHighlighted" Value="true">
            <Setter Property="BACkground" Targetname="border" Value="{Dynamicresource ItemSELEctedBrushKey}" />
            <Setter Property="borderBrush" Targetname="border">
                <Setter.Value>
                    <linearGradIEntBrush EndPoint="0.5,1" StartPoint="0.5,0">
                        <GradIEntStop color="#FF888888" Offset="0" />
                        <GradIEntStop color="transparent" Offset="1" />
                    </linearGradIEntBrush>
                </Setter.Value>
            </Setter>
        </trigger>
        <trigger Property="IsEnabled" Value="false">
            <Setter Property="Opacity" Value="{Dynamicresource disabLeopacity}" />
        </trigger>
    </ControlTemplate.triggers>
</ControlTemplate>

当 MenuItem 被禁用(Command CanExecute 返回 false)时,Togglebutton 也被禁用。

如何只启用 Togglebutton?

编辑:

我设法通过在包含 Togglebuttons 的 topLevelheader 模板弹出窗口中添加一个新的 ItemsControl 来满足我的需求:

<ControlTemplate x:Key="VerticalToolbarMenutopLevelheaderTemplate" targettype="{x:Type MenuItem}">
    <border x:name="border">
        <GrID>
            <ContentPresenter margin="6,3,20,3" Contentsource="header" RecognizesAccessKey="True" HorizontalAlignment="Right" />
            <Popup x:name="Popup" Placement="Bottom" IsOpen="{TemplateBinding IsSubmenuOpen}" AllowsTransparency="True" Focusable="false" PopupAnimation="Fade" StaysOpen="True">
                <border x:name="Submenuborder" SnapsToDevicePixels="True" borderThickness="1" BACkground="{Dynamicresource ToolbarPopupBACkgroundBrushKey}" 
                        borderBrush="{Dynamicresource PopupborderBrushKey}">
                    <ScrollVIEwer CanContentScroll="True" VerticalScrollbarVisibility="auto">
                        <GrID>
                            <GrID.columnDeFinitions>
                                <columnDeFinition />
                                <columnDeFinition WIDth="*" />
                            </GrID.columnDeFinitions>
                            <ItemsControl Itemssource="{Binding }">
                                <ItemsControl.ItemTemplate>
                                    <DataTemplate>
                                        <GrID Height="25">
                                            <Togglebutton x:name="PART_Starbutton" Style="{Dynamicresource VerticalToolbarMenuStarTogglebuttonStylE}" VerticalAlignment="Center" margin="2,0" />
                                        </GrID>                                            
                                    </DataTemplate>
                                </ItemsControl.ItemTemplate>
                            </ItemsControl>
                            <StackPanel IsItemsHost="True" KeyboardNavigation.DirectionalNavigation="Cycle" GrID.column="1" />
                        </GrID>                            
                    </ScrollVIEwer>
                </border>
            </Popup>
        </GrID>
    </border>
    <ControlTemplate.triggers>
        <trigger Property="IsSuspendingPopupAnimation" Value="true">
            <Setter Targetname="Popup" Property="PopupAnimation" Value="None" />
        </trigger>
        <trigger Property="IsHighlighted" Value="true">
            <Setter Targetname="border" Property="borderBrush" Value="transparent" />
            <Setter Property="BACkground" Targetname="border" Value="{Dynamicresource ItemSELEctedBrushKey}" />
        </trigger>
        <trigger sourcename="Popup" Property="AllowsTransparency" Value="True">
            <Setter Targetname="Submenuborder" Property="CornerRadius" Value="0,4,4" />
            <Setter Targetname="Submenuborder" Property="padding" Value="0,3" />
        </trigger>
        <trigger Property="IsEnabled" Value="false">
            <Setter Property="Opacity" Value="{Dynamicresource disabLeopacity}" />
        </trigger>
    </ControlTemplate.triggers>
</ControlTemplate>

解决方法

不,你不能这样做。 当 CanExecute 返回 false 时,IsEnabled 属性采用相同的值。 IsEnabled = false 不仅禁用元素本身,还禁用嵌套在其中的所有内容。 此行为在 UIElement 中定义且无法更改。

大佬总结

以上是大佬教程为你收集整理的WPF 菜单 - 允许在禁用的菜单项中启用特定控件全部内容,希望文章能够帮你解决WPF 菜单 - 允许在禁用的菜单项中启用特定控件所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。
标签:-菜单