gpt4 book ai didi

wpf - 如何从另一个窗口的主窗口级别访问命令?

转载 作者:行者123 更新时间:2023-12-04 19:35:37 25 4
gpt4 key购买 nike

我试图在另一个窗口中访问在 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();
}

我通过数据绑定(bind)访问这些命令:

<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>

这些命令在通过框架加载到 MainWindow.xaml 中的页面中起作用。但是,如果我有不属于 MainWindow.xaml 的弹出窗口,这些命令只会变灰并且不再起作用(无法执行)。非常感谢任何建议!

最佳答案

您定义命令的方式是为特定窗口定义的。如果你想全局处理命令,在应用层,你可以使用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();
}
}

并且在您的菜单样式中,您应该将绑定(bind)更改为 x:Static:

<Setter Property="Command" Value="{x:Static my:GlobalCommands.AddCommand1}" />


路由命令时,在检查 UI 中每个事件元素中的命令绑定(bind)时,还将检查为每个元素的类注册的绑定(bind)。通过在此处注册绑定(bind),您可以使类的每个实例都能够处理特定命令。

因此,在上面的示例中,使用了 Window 类型,这将导致路由在任何 Window ,一旦路由在搜索命令绑定(bind)时到达该实例。

例如,您可以改为将处理限制到 Window 的特定子类,这样命令将只绑定(bind)到该子类的实例中。或者您可以使用其他一些 UI 元素类型,以便该特定类型元素的存在会导致事件得到处理。只需根据您的特定需求适本地设置已注册命令绑定(bind)的拥有类型。

关于wpf - 如何从另一个窗口的主窗口级别访问命令?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4950886/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com