C# 如何将快捷方式从MainWindow传递到ContentControl中的UserControl?

C# 如何将快捷方式从MainWindow传递到ContentControl中的UserControl?,c#,wpf,user-controls,keyboard-shortcuts,C#,Wpf,User Controls,Keyboard Shortcuts,动态加载到“我的窗口”中的ContentControl的UserControl不会接收UserControl XAML中定义的键盘快捷键,以防它未聚焦 我需要为动态加载的UserControl实现键盘快捷键,而无需关注UserControl 我无法在MainWindow上定义InputBindings,因为InputBindings的更改取决于当前加载的UserControl 1所以我试图通过RaiseEvent将所有的Window_KeyUp发送到加载的UserControl,但没有成功。St

动态加载到“我的窗口”中的ContentControl的UserControl不会接收UserControl XAML中定义的键盘快捷键,以防它未聚焦

我需要为动态加载的UserControl实现键盘快捷键,而无需关注UserControl

我无法在MainWindow上定义InputBindings,因为InputBindings的更改取决于当前加载的UserControl

1所以我试图通过RaiseEvent将所有的Window_KeyUp发送到加载的UserControl,但没有成功。StackOverflow异常或未调用任何操作

2当UserControl已加载到ContentControl时,我还尝试通过LoadedUserControl.InputBindings填充MainWindow.InputBindings。。。上下文中没有未知的已定义命令

UserControl.xaml
----------------

<UserControl.InputBindings>
        <KeyBinding Key="N" Command="{Binding Path=NewOrderCommand}" Modifiers="Control" />
</UserControl.InputBindings>
所以这是StackOverflowException

我试着设置e.Handled=true;在RaiseEvent之前,但它不会将事件传递给UserControl,因此不会发生任何事情

我还尝试将InputBindings从UserControl获取到MainWindow:

foreach(InputBinding bi in UserControl.InputBindings)
   MainWindow.InputBindings.Add(bi);
但我在调试窗口中遇到异常:

找不到目标元素的治理FrameworkElement或FrameworkContentElement。BindingExpression:Path=neworder命令;DataItem=null;目标元素是'KeyBinding'HashCode=35527846;目标属性为“命令”类型“ICommand”


我的期望是,我将根据加载的UserControl动态更改窗口输入绑定,其中定义了输入绑定。

尝试使用ViewModels作为DataContext,并让它们使用Messenger相互通信。您可以将所需信息发送到未聚焦Usercontrol的ViewModel

如果要继续使用代码隐藏,请订阅Mainwindow上的eventhandler:

PreviewKeyUp += userCtrl.OnKeyUp;
并在用户控件中处理它

public void OnKeyUp(object sender, KeyEventArgs e)
    {
        MyTextBlock.Text = e.Key.ToString();
    }
如果希望UserControl能够处理窗口中的所有按键操作,则可以在加载UserControl后使用window.GetWindow获取对父窗口的引用,然后将事件处理程序连接到父窗口:

public partial class UserControl1 : UserControl
{
    public UserControl1()
    {
        InitializeComponent();
        Loaded += (s, e) =>
        {
            Window parentWindow = Window.GetWindow(this);
            parentWindow.PreviewKeyDown += ParentWindow_PreviewKeyDown;
        };
        Unloaded += (s, e) =>
        {
            Window parentWindow = Window.GetWindow(this);
            parentWindow.PreviewKeyDown -= ParentWindow_PreviewKeyDown;

        };
    }

    private void ParentWindow_PreviewKeyDown(object sender, KeyEventArgs e)
    {
        //do something...
    }
}

这是一个很好的解决办法。谢谢你的点球。尽管如此,我还是希望在每个UserControl中使用XAML中定义的KeyInput,而不是switch/case,但您不能使用XAML中定义的KeyBinding来实现这一点。您可以将公共代码放在基类或扩展方法中,或者所有用户控件都可以访问的任何地方。谢谢,这是目前我可以使用的最好的解决方案。
public partial class UserControl1 : UserControl
{
    public UserControl1()
    {
        InitializeComponent();
        Loaded += (s, e) =>
        {
            Window parentWindow = Window.GetWindow(this);
            parentWindow.PreviewKeyDown += ParentWindow_PreviewKeyDown;
        };
        Unloaded += (s, e) =>
        {
            Window parentWindow = Window.GetWindow(this);
            parentWindow.PreviewKeyDown -= ParentWindow_PreviewKeyDown;

        };
    }

    private void ParentWindow_PreviewKeyDown(object sender, KeyEventArgs e)
    {
        //do something...
    }
}