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 [email protected]}" Width="38" Height="38" Margin="0,0,0,0" VerticalAlignment="Center"  >
                    <Image  x:Name="img_menuIcon" MouseEnter="MenuItemImage_MouseEnter"  MouseLeave="MenuItemImage_MouseLeave"   Source="{Binding [email protected]}"  IsEnabled="{Binding [email protected]}" Opacity="{Binding [email protected],Converter= {StaticResource  bto}}"><!--Width="38" Height="38"--></Image>
                </TextBlock>
                <TextBlock x:Name="img_Title" Text ="{Binding [email protected]}" VerticalAlignment="Center" HorizontalAlignment="Center" TextAlignment="Center" Margin="0,3,0,0" Foreground="#FFD1D1D1" FontSize="{Binding [email protected]}" MouseEnter="MenuItemText_MouseEnter"  MouseLeave="MenuItemText_MouseLeave" IsEnabled="{Binding [email protected]}" Opacity="{Binding [email protected],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();
        }  

    }

  

时间: 2024-12-05 15:38:06

WPF:设置弹出子菜单的是否可用状态及效果的相关文章

在框架左边实现点击菜单弹出子菜单

<html> <head> <title>index</title> <link type="text/css" rel="stylesheet" href="css/middle-left.css" /> <script language = "javascript" src="js/middle-left.js"></scri

WPF TriggerAction弹出子窗体 TargetedTrigger、TargetedTriggerAction用法

namespace TriggerAction { public class OpenWindowAction : TriggerAction<DependencyObject> { public Type WindowType { get { return (Type)GetValue(WindowTypeProperty); } set { SetValue(WindowTypeProperty, value); } } public static readonly DependencyP

在弹出的菜单中模仿微信的右上角

采用PopupWindow在弹出的菜单右上角实现仿微信. 效果如下面的: watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQveGlhb3lpX3RkY3E=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" > popupWindow代码例如以下: import java.util.ArrayList; import java.util.HashMap;

WPF FileFolderDialog 和弹出子窗口的一些问题

摘要:本文主要是WPF中 FileFolderDialog的相关问题,补充了关于在父窗口弹出子窗口,以及子窗口的相关属性(Data Binding)和命令绑定(Delegate Command)问题,里面还有关于如何使用读写xml文件内容的方法. 需要注意的地方: (1)对于每一个窗口(父窗口和子窗口),如果涉及到Data Binding相关问题的时候,均需要设置其对应的DataContext(一般为其ViewModel); (2)对于未在构造函数中初始化的属性,需要在定义的时候进行实例化(如下

[WPF]DataGrid C#添加右键弹出选择菜单

private void dataGrid_MouseRightButtonDown(object sender, MouseButtonEventArgs e) { ContextMenu context = new ContextMenu(); MenuItem item = new MenuItem(); item.Header = "点击删除该行数据"; item.Click += new RoutedEventHandler(item_Click); context.Item

弹出上下文菜单

弹出上下文菜单 m_Main  m_menu_pop m_menu_pop =create  m_Main integer Px,Py  //设置弹出菜单位置 Px = this.x+ PointerX() Py = this.y +PointerY() m_menu_pop.PopMenu(Px,Py) destroy m_menu_pop return 0 如果在父窗口w_parent右击子窗口w_son后弹出上下文菜单,点击该菜单的 "打开窗口" 选项后弹出另一个窗口w_else

用PopupWindow实现弹出菜单(弹出的菜单采用自定义布局)

     用PopupWindow实现弹出菜单是一个比较好的方式.当然我们还有一个类PopupMenu也能实现弹出菜单,但那个太过于局限了,所以不是很推荐. 这个实例的效果是这样的:点击按钮后,一个菜单从屏幕的右边滑入到屏幕中,点击按钮/空白处后菜单消失. 布局文件时一个按钮,我就不贴出代码了.下面是菜单的布局: <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android=&

EditorGUILayout.EnumPopup 枚举弹出选择菜单

http://www.unity蛮牛.com/thread-25490-1-1.html http://www.unity蛮牛.com/m/Script/EditorGUILayout.EnumPopup.html EditorGUILayout.EnumPopup 枚举弹出选择菜单 static function EnumPopup (selected : System.Enum, params options : GUILayoutOption[]) : System.Enumstatic

windows10系统开机后直接弹出开始菜单的解决方案

win10正式版是新版的操作系统,所以用户在使用过程中可能也会碰到一些新的问题.比如,最近有用户反馈,Win10系统开机之后无法显示桌面内容,直接弹出开始菜单,占满了屏幕,而且点击Win键也无法关闭,这是怎么回事呢?其实,该问题是用户不小心进入了Win10系统平板模式导致的.下面,小编就给大家分享下解决方案. 步骤如下: 点击右下角的"通知中心"图标,然后点击"平板模式"即可关闭"平板模式",再次点击的话即可从新进入! 以上就是皇冠新2网址小编给