WPF:设置弹出子菜单的是否可用状态及效果
Posted 慧由心生
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了WPF:设置弹出子菜单的是否可用状态及效果相关的知识,希望对你有一定的参考价值。
需求: 设置弹出子菜单(二级)项仅首项可用,其他项均不可用;不可用是呈灰色效果。
注:
菜单项都是依据层级数据模板。具体格式如下:
StackBlock{TextBlock{Image}、TextBlock}}
问题:
1、窗体加载后,获取不到二级子菜单控件(二级菜单项弹出后,可获取所有二级子菜单)。
注:仅能获取一级菜单控件,但能获取二级子菜单绑定的数据源。
2、层级数据模板内StackBlock设置为不可用时(绑定数据源实现),弹出子菜单不可用,但恢复程序中恢复StackBlock设置为可用,后MenuItem内的Image仍不可用。
3、样式中可设置MenuItem的不可用状态及效果,但若不将StackBlock设置为不可用则,Menuitem一致可用。
注:即便是先将TextBlock设置为不可用,再设置为可用,其下的Image仍不可用。
解决方法:
1、通过绑定数据源来设置可用不可用
2、绑定的MenuItem内的对象:Image、TextBlock
3、灰色效果也绑定到是否可用数据源。
注:是否可用转换为灰色效果(Opacity)需要值转换。
参考代码:
1、层级数据模板
<!--工具数据源--> <XmlDataProvider x:Key="toolsDS" Source="Config\\Tools\\Tools_Classroom.xml" XPath="Tools/Tool"></XmlDataProvider> <!--Tool模板--> <HierarchicalDataTemplate DataType="Tool" ItemsSource="{Binding XPath=Tool}" > <StackPanel Orientation="Vertical" VerticalAlignment="Center" Margin="0,10,0,0" > <!--MouseEnter="MenuItemImage_MouseEnter" MouseLeave="MenuItemImage_MouseLeave"--> <TextBlock Tag ="{Binding XPath=@Name}" Width="38" Height="38" Margin="0,0,0,0" VerticalAlignment="Center" > <Image x:Name="img_menuIcon" MouseEnter="MenuItemImage_MouseEnter" MouseLeave="MenuItemImage_MouseLeave" Source="{Binding XPath=@ImagePath0}" IsEnabled="{Binding XPath=@isEnable}" Opacity="{Binding XPath=@isEnable,Converter= {StaticResource bto}}"><!--Width="38" Height="38"--></Image> </TextBlock> <TextBlock x:Name="img_Title" Text ="{Binding XPath=@Title}" VerticalAlignment="Center" HorizontalAlignment="Center" TextAlignment="Center" Margin="0,3,0,0" Foreground="#FFD1D1D1" FontSize="{Binding XPath=@FontSize}" MouseEnter="MenuItemText_MouseEnter" MouseLeave="MenuItemText_MouseLeave" IsEnabled="{Binding XPath=@isEnable}" Opacity="{Binding XPath=@isEnable,Converter= {StaticResource bto}}"> </TextBlock> </StackPanel> </HierarchicalDataTemplate>
2、菜单
<Menu x:Name="menuTools" ItemsSource="{Binding Source={StaticResource ResourceKey= toolsDS}}" Background="Transparent" ></Menu>
3、值转换
public class OpacityValueConverter : IValueConverter { public object Convert(object value, Type targetType, object parameter, CultureInfo culture) { string c = (string)value; switch (c) { case "true": return 1; case "false": return 0.5; default: return 1; } } public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) { throw new NotImplementedException(); } }
以上是关于WPF:设置弹出子菜单的是否可用状态及效果的主要内容,如果未能解决你的问题,请参考以下文章
WPF FileFolderDialog 和弹出子窗口的一些问题
asp.net 做导航 用menu控件,实现菜单横排,鼠标移动到菜单的一项上,向下弹出子菜单。这个效果的xml怎么
WPF TriggerAction弹出子窗体 TargetedTriggerTargetedTriggerAction用法