我正在尝试访问另一个窗口中MainWindow.xaml中定义的命令。我只能将这些命令的标题变为灰色。我想知道为了获得完全访问权应该做些什么。
命令示例:
public partial class MainWindow : Window
{
public static RoutedUICommand AddCommand1 = new RoutedUICommand("Command ", "command1", typeof(MainWindow));
public MainWindow()
{
InitializeComponent();
this.CommandBindings.Add(new CommandBinding(AddCommand1, AddCommand1Executed));
}
private void AddCommand1Executed(object sender, ExecutedRoutedEventArgs e)
{
AddNewItem picker = new AddNewItem();
picker.ShowDialog();
}
我通过数据绑定以样式访问这些命令:
<Menu x:Name="TaskMenuContainer"><MenuItem x:Name="menuItem" Header="TASKS" ItemsSource="{Binding}" Template="{DynamicResource TaskMenuTopLevelHeaderTemplateKey}">
<MenuItem.ItemContainerStyle>
<Style TargetType="{x:Type MenuItem}">
<Setter Property="Command" Value="{Binding}" />
<Setter Property="Header" Value="{Binding Text, RelativeSource={RelativeSource Self}}" />
<Setter Property="CommandTarget" Value="{Binding RelativeSource={RelativeSource Self}}"/>
</Style>
</MenuItem.ItemContainerStyle>
这些命令适用于通过frame在MainWindow.xaml中加载的页面。但是,如果我弹出不属于MainWindow.xaml的窗口,则这些命令只会变灰并且不再起作用(无法执行)。任何建议都非常感谢!
答案 0 :(得分:3)
您定义命令的方式是为特定窗口定义它。如果要全局处理该命令,则可以在应用程序级别使用CommandManager.RegisterClassCommandBinding
:
首先,在单独的静态类中定义命令:
public static class GlobalCommands
{
public static RoutedUICommand AddCommand1 = new RoutedUICommand("Command ", "command1", typeof(MainWindow));
}
然后,在您的窗口或您想要放置命令逻辑的任何地方,注册命令处理程序:
public partial class MainWindow : Window
{
static MainWindow()
{
CommandManager.RegisterClassCommandBinding(typeof(Window), new CommandBinding(GlobalCommands.AddCommand1, AddCommand1Executed, CanAddExecute));
}
private static void AddCommand1Executed(object sender, ExecutedRoutedEventArgs e)
{
AddNewItem picker = new AddNewItem();
picker.ShowDialog();
}
}
在菜单样式中,您应该将绑定更改为x:Static
:
<Setter Property="Command" Value="{x:Static my:GlobalCommands.AddCommand1}" />
当路由命令时,当检查UI中每个活动元素中的命令绑定时,还将检查为每个元素的类注册的绑定。通过在此处注册绑定,可以使类的每个实例都能够处理特定命令。
因此,在上面的示例中,使用了类型Window
,一旦路由,这将导致路由在 Window
的任何实例中查找命令绑定在搜索命令绑定时到达该实例。
Window
的特定子类,以便命令仅绑定在该子类的实例中。或者您可以使用其他一些UI元素类型,以便该特定类型的元素的存在将导致事件被处理。只需根据您的特定需要为已注册的命令绑定设置拥有类型。