标签:
需求: 设置弹出子菜单(二级)项仅首项可用,其他项均不可用;不可用是呈灰色效果。
注:
菜单项都是依据层级数据模板。具体格式如下:
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(); } }
标签:
原文地址:http://www.cnblogs.com/shenchao/p/5557200.html