【问题标题】:KeyBinding on multiple windows in wpfwpf中多个窗口上的KeyBinding
【发布时间】:2018-08-13 06:57:48
【问题描述】:

我目前正在编写一个由主窗口组成的应用程序(这里的DataContext是我的一个类,MainWindowController),我在其中定义了这个KeyBinding:

<Window.InputBindings>
    <KeyBinding Key="N" Modifiers="Control" Command="{Binding Path=NewProgramCommand}"/>
    <KeyBinding Key="O" Modifiers="Control" Command="{Binding Path=OpenProgramCommand}"/>
    <KeyBinding Key="S" Modifiers="Control" Command="{Binding Path=SaveProxyCommand}"/>
    <KeyBinding Key="W" Modifiers="Control" Command="{Binding Path=CloseProxyCommand}"/>
</Window.InputBindings>

我可以从我的主窗口打开其他窗口。我已经定义了一个抽象类 AbstractWindow: Window 来处理应用程序关闭等。 我的另一个窗口被创建为 AbstractWindows

<window:AbstractWindow x:Class="FinancialViewModule.FinancialView"
         xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
         xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
         xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
         Height="800" Width="1280"
         d:DesignHeight="300" d:DesignWidth="300">

当用户点击一个按钮时,一个命令会创建一个新窗口。

 mController.FinancialView = new FinancialView();
 mController.FinancialView.Show();

我希望我的 KeyBindings 可以在所有窗口中工作,所以在 AbstractWindow 构造函数中,我有:

InputBindings.AddRange(Application.Current.MainWindow.InputBindings);

快捷方式可在 FinancialView 窗口中使用,但输出中有错误:

System.Windows.Data Error: 2 : Cannot find governing FrameworkElement or FrameworkContentElement for target element. BindingExpression:Path=NewProgramCommand; DataItem='MainWindowController' (HashCode=37314933); target element is 'KeyBinding' (HashCode=38008833); target property is 'Command' (type 'ICommand')
System.Windows.Data Error: 2 : Cannot find governing FrameworkElement or FrameworkContentElement for target element. BindingExpression:Path=OpenProgramCommand; DataItem='MainWindowController' (HashCode=37314933); target element is 'KeyBinding' (HashCode=5210297); target property is 'Command' (type 'ICommand')
System.Windows.Data Error: 2 : Cannot find governing FrameworkElement or FrameworkContentElement for target element. BindingExpression:Path=SaveProxyCommand; DataItem='MainWindowController' (HashCode=37314933); target element is 'KeyBinding' (HashCode=34357331); target property is 'Command' (type 'ICommand')
System.Windows.Data Error: 2 : Cannot find governing FrameworkElement or FrameworkContentElement for target element. BindingExpression:Path=CloseProxyCommand; DataItem='MainWindowController' (HashCode=37314933); target element is 'KeyBinding' (HashCode=41051448); target property is 'Command' (type 'ICommand')

我能做些什么来避免这个错误?有没有更好的方法让应用的所有窗口都使用相同的快捷方式?

【问题讨论】:

    标签: c# wpf xaml key-bindings


    【解决方案1】:

    在每个窗口实例中创建新的键绑定:

    KeyBinding n = new KeyBinding() { Modifiers = ModifierKeys.Control, Key = Key.N };
    KeyBinding o = new KeyBinding() { Modifiers = ModifierKeys.Control, Key = Key.O };
    KeyBinding s = new KeyBinding() { Modifiers = ModifierKeys.Control, Key = Key.S };
    KeyBinding w = new KeyBinding() { Modifiers = ModifierKeys.Control, Key = Key.W };
    BindingOperations.SetBinding(n, InputBinding.CommandProperty, new Binding("NewProgramCommand"));
    BindingOperations.SetBinding(o, InputBinding.CommandProperty, new Binding("OpenProgramCommand"));
    BindingOperations.SetBinding(s, InputBinding.CommandProperty, new Binding("SaveProxyCommand"));
    BindingOperations.SetBinding(w, InputBinding.CommandProperty, new Binding("CloseProxyCommand"));
    InputBindings.AddRange(new KeyBinding[4] { n, o, s, w });
    

    ...并确保将每个窗口的 DataContext 设置为 MainWindowController 或定义命令的任何类型。

    【讨论】:

    • 谢谢。我无法将我的 DataContext 设置为MainWindowController,因为我需要它是别的东西,但我明白。也许我的方式从一开始就是错误的
    • 好吧,如果新窗口的 DataContext 没有这些命令,那么尝试绑定它们是没有意义的。
    猜你喜欢
    • 2013-12-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多