代码之家  ›  专栏  ›  技术社区  ›  emiliegue

wpf中多个窗口上的键绑定

  •  0
  • emiliegue  · 技术社区  · 6 年前

    我目前正在编程一个应用程序,它由主窗口(这里的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>
    

    我可以从主窗口打开其他窗口。我定义了一个抽象类abstract Window:Window来处理应用程序关闭等问题。

    <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();
    

    我希望我的键绑定可以在所有窗口中工作,因此,在AbstractWindow构造函数中,我有:

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

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

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

    1 回复  |  直到 6 年前
        1
  •  0
  •   mm8    6 年前

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

    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 或者定义命令的任何类型。