簡體   English   中英

啟用所有項目的ischeckable = true時,如何使菜單項列表中的僅一項可檢查?

[英]how to make only one item to be checkable in the menu item's list on enabling ischeckable=true of all items?

在我的代碼中,我嘗試實現只能在特定時間從菜單項中檢查一項,但是我的代碼給出了error-MenuKinect (我的解決方案的名稱)是未聲明的前綴,請解釋如何解決此錯誤?

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中使用類對象。

您可以在根級別(窗口或UserControl)定義它,也可以在根菜單中定義它。

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

Namespace_Name替換為定義MenuItemExtensions類的實際名稱空間。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM