C# 如何在启用所有项的ischeckable=true时,使菜单项列表中只有一项可检查?
在我的代码中,我尝试实现了在特定时间只能从菜单项中检查一个项,但我的代码给出了错误MenuKinect name of my solution是一个未声明的前缀,请解释如何解决此错误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
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为什么它不工作?