Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/262.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何在启用所有项的ischeckable=true时,使菜单项列表中只有一项可检查?_C#_Wpf_Xaml - Fatal编程技术网

C# 如何在启用所有项的ischeckable=true时,使菜单项列表中只有一项可检查?

C# 如何在启用所有项的ischeckable=true时,使菜单项列表中只有一项可检查?,c#,wpf,xaml,C#,Wpf,Xaml,在我的代码中,我尝试实现了在特定时间只能从菜单项中检查一个项,但我的代码给出了错误MenuKinect name of my solution是一个未声明的前缀,请解释如何解决此错误 xaml code- <Menu Height="23" Name="menu1" Width="171" Margin="10,10,0,0" HorizontalAlignment="Center" VerticalAlignment="Top" Background="#FF004165"&g

在我的代码中,我尝试实现了在特定时间只能从菜单项中检查一个项,但我的代码给出了错误MenuKinect name of my solution是一个未声明的前缀,请解释如何解决此错误

xaml code-
     <Menu Height="23" Name="menu1" Width="171" Margin="10,10,0,0" HorizontalAlignment="Center" VerticalAlignment="Top" Background="#FF004165">
<MenuItem Header="Settings">
                    <Separator Style="{StaticResource SeparatorStyleKey}" />
                    <MenuItem x:Name="headerLogoutTime" Header="LogOut Time" Background="#FF004165">
                        <MenuItem x:Name="header10Min" Header="10 Min"  Background="#FF004165" IsCheckable="True" MenuKinect:MenuItemExtensions.GroupName="LogOutTimeGroup"  Style="{StaticResource MyMenuItem}"  ></MenuItem>
                        <Separator Style="{StaticResource SeparatorStyleKey}" />

                        <MenuItem x:Name="header20Min" Header="20 Min"  Background="#FF004165" IsCheckable="True" MenuKinect:MenuItemExtensions.GroupName="LogOutTimeGroup" Style="{StaticResource MyMenuItem}" ></MenuItem>
                        <Separator Style="{StaticResource SeparatorStyleKey}" />

                        <MenuItem x:Name="header30Min" Header="30 Min"  Background="#FF004165" IsCheckable="True" MenuKinect:MenuItemExtensions.GroupName="LogOutTimeGroup" Style="{StaticResource MyMenuItem}"   ></MenuItem>
                        <Separator Style="{StaticResource SeparatorStyleKey}" />

                        <MenuItem x:Name="header40Min" Header="40 Min"  Background="#FF004165" IsCheckable="True" MenuKinect:MenuItemExtensions.GroupName="LogOutTimeGroup" Style="{StaticResource MyMenuItem}" ></MenuItem>
                        <Separator Style="{StaticResource SeparatorStyleKey}" />

                        <MenuItem x:Name="header50Min" Header="50 Min"  Background="#FF004165" IsCheckable="True" MenuKinect:MenuItemExtensions.GroupName="LogOutTimeGroup" Style="{StaticResource MyMenuItem}"  ></MenuItem>
                        <Separator Style="{StaticResource SeparatorStyleKey}" />

                    </MenuItem>
                    <Separator Style="{StaticResource SeparatorStyleKey}" />

                    <MenuItem Header="LogOut" Background="#FF004165" ></MenuItem>
                    <Separator Style="{StaticResource SeparatorStyleKey}" />

                </MenuItem>

            </Menu>
MenuItemExtensions.cs

public class MenuItemExtensions : DependencyObject
    {
    public static Dictionary<MenuItem, String> ElementToGroupNames = new Dictionary<MenuItem, String>();

    public static readonly DependencyProperty GroupNameProperty =
        DependencyProperty.RegisterAttached("GroupName",
                                     typeof(String),
                                     typeof(MenuItemExtensions),
                                     new PropertyMetadata(String.Empty, OnGroupNameChanged));

    public static void SetGroupName(MenuItem element, String value)
    {
        element.SetValue(GroupNameProperty, value);
    }

    public static String GetGroupName(MenuItem element)
    {
        return element.GetValue(GroupNameProperty).ToString();
    }

    private static void OnGroupNameChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
    {
        //Add an entry to the group name collection
        var menuItem = d as MenuItem;

        if (menuItem != null)
        {
            String newGroupName = e.NewValue.ToString();
            String oldGroupName = e.OldValue.ToString();
            if (String.IsNullOrEmpty(newGroupName))
            {
                //Removing the toggle button from grouping
                RemoveCheckboxFromGrouping(menuItem);
            }
            else
            {
                //Switching to a new group
                if (newGroupName != oldGroupName)
                {
                    if (!String.IsNullOrEmpty(oldGroupName))
                    {
                        //Remove the old group mapping
                        RemoveCheckboxFromGrouping(menuItem);
                    }
                    ElementToGroupNames.Add(menuItem, e.NewValue.ToString());
                    menuItem.Checked += MenuItemChecked;
                }
            }
        }
    }

    private static void RemoveCheckboxFromGrouping(MenuItem checkBox)
    {
        ElementToGroupNames.Remove(checkBox);
        checkBox.Checked -= MenuItemChecked;
    }


    static void MenuItemChecked(object sender, RoutedEventArgs e)
    {
        var menuItem = e.OriginalSource as MenuItem;
        foreach (var item in ElementToGroupNames)
        {
            if (item.Key != menuItem && item.Value == GetGroupName(menuItem))
            {
                item.Key.IsChecked = false;
            }
        }
    }
}
在根级别声明命名空间以使用XAML中的类对象

您可以在根级别的窗口或用户控件中定义它,也可以在根菜单中定义它

<Menu xmlns:MenuKinect="clr-namespace:Namespace_Name>"

用定义了MenuItemExtensions类的实际命名空间替换Namespace_Name。

我包括了这样的内容,它给出了错误的命名空间not correctMenuKinect命名空间,并且这个XAML所在的命名空间在同一个程序集项目中?另外,如果您已经定义了本地命名空间,则无需使用其他名称重新声明它。您可以这样使用它:local:MenuItemExtensions.GroupName=LogOutTimeGroup.但是当我没有声明本地名称空间时,当时我正在编写MenuKinect:MenuItemExtensions.GroupName=LogOutTimeGroup为什么它不工作?