当子窗口聚焦时(同一个wpf窗口),我的inputcommand键绑定到主窗口不起作用

本文关键字:窗口 inputcommand 绑定 我的 不起作用 聚焦 wpf 同一个 | 更新日期: 2023-09-27 18:25:41

我面临一个输入命令键绑定问题。在这里我解释一下我的情况。。。我已经绑定了输入命令键绑定,如下所示,

<Window x:Class="DefaultBehavior_KeyBinding.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="MainWindow" Height="350" Width="525">
<Window.InputBindings>
    <KeyBinding Key="F2" Command="{Binding TestCommand}"/>
</Window.InputBindings>
<Grid>
    <Button Content="Add" Width="100" Height="35" Grid.Row="0" Name="EmptyButton" Click="EmptyButton_Click"/>
</Grid>

它运行良好。然后我在按钮点击事件中打开了新的wpf子窗口,如下所示,

public partial class MainWindow : Window
{
    public ICommand TestCommand { get; private set; }
    public MainWindow()
    {
        this.TestCommand = ........some command is attached here...
        InitializeComponent();
        this.DataContext = this;
    }
    private void EmptyTabButton_Click(object sender, RoutedEventArgs e)
    {
        Window childwindow = new Window() { Title = "ChildWindow", Width = 200, Height = 300 };
        childwindow.Show();
    }
}

打开子窗口后,当子窗口聚焦时,绑定到主窗口的键不起作用。如果我把焦点切换到主窗口意味着,这很好。

我知道,主窗口和子窗口都是相互独立的。

但我的问题是,当我只将键绑定到主窗口时,我如何才能使我的子窗口集中工作。我不想将此绑定设置为每个子窗口,因为在我的情况下,我使用了很多子窗口。

有人能给我提一下你的建议吗?

当子窗口聚焦时(同一个wpf窗口),我的inputcommand键绑定到主窗口不起作用

只有当Form是焦点时,键绑定才会起作用。您可以将新窗口中的每个命令重定向到主窗口

将构造函数更改为新窗口的构造函数以接受主窗口并保存此窗口:

MainWindow mainWindow;
public Window(MainWindow w)
{
   mainWindow = w;
}

每当执行Keybinding时,只需执行以下操作:

mainWindow.TabPress();

并显示带有的窗口

Window childwindow = new Window(this) { Title = "ChildWindow", Width = 200, Height = 300 };
childwindow.Show();

您可以尝试以Window样式设置输入绑定(应该在App.xaml中定义),以便它将应用于所有Window对象吗。

此代码未经过测试!(但它无论如何都应该起作用:D)

您可以将InputBindingsMainWindow添加到子窗口InputBindingCollection,如下所示:

    private void EmptyTabButton_Click(object sender, RoutedEventArgs e)
    {
        Window childwindow = new Window() { Title = "ChildWindow", Width = 200, Height = 300 };
        childWindow.InputBindings.AddRange(this.InputBindings);
        childwindow.Show();
    }

通过这样做,子窗口应该对您的输入做出反应,并执行来自MainWindow的命令。