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

时间:2013-07-31 09:23:18

标签: c# wpf silverlight silverlight-4.0 wpf-controls

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

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

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

我知道,主窗口和子窗口彼此独立。

但我的问题是,当我将键绑定仅限于主窗口时,如何将其作为工作我的子窗口。我不想将这个绑定设置到每个子窗口,因为在我的情况下我使用了很多子窗口。

任何人请向我提出你的建议吗?

3 个答案:

答案 0 :(得分:0)

只有在关注表单时,键绑定才有效。 您可以将新窗口中的每个命令重定向到主窗口

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

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

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

mainWindow.TabPress();

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

答案 1 :(得分:0)

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

答案 2 :(得分:0)

此代码未经过测试! (但它应该可以工作:D)

您可以将InputBindings中的MainWindow添加到子窗口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中的命令。