尝试使用KeyBinding执行方法

时间:2018-11-17 18:44:16

标签: wpf

当用户按下ctrl + Tab时,我正在尝试执行一种方法。如果有多个窗口(App.Current.Windows> 1),则CanExecute应该为true,否则为false。
到目前为止,我阅读的所有文章都建议我需要为ICommand和ViewModel编写一个子类,这基本上是UI和tge自定义命令之间的“链接”。我看过一些例子 of how to create bindings 因为我没有得到,所以我试图 learn more about MVVM 但我恐怕还是一无所知。


如果CanExecute为true,则示例将检查打开多个窗口并执行方法SomeMethod的示例是什么?我将在哪里放置什么?对不起,但是我整天都在搜寻和尝试-仍然感到一无所知。
有任何示例或说明的指针吗?

2 个答案:

答案 0 :(得分:1)

我感到您是WPF和MVVM的新手,尽管建议这样做,但您不必将MVVM与WPF一起使用。您可以通过事件处理程序执行相同的操作。

您可能想尝试以下方法:

public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();

        KeyUp += MainWindow_KeyUp;
    }

    private void MainWindow_KeyUp(object sender, KeyEventArgs e)
    {
        if (e.Key == Key.Tab && (Keyboard.IsKeyDown(Key.LeftCtrl) || Keyboard.IsKeyDown(Key.RightCtrl)))
        {
            MessageBox.Show(App.Current.Windows.Count.ToString());
        }
    }
}

答案 1 :(得分:1)

这是您可以怎么做

在Xaml中:

<Window x:Class="Test.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        mc:Ignorable="d"
        Title="MainWindow" Height="450" Width="800">
    <Window.Resources>
        <RoutedUICommand x:Key="ExecuteCommand" Text="ExecuteCommand" />
    </Window.Resources>
    <Window.InputBindings>
        <KeyBinding Key="Tab" Modifiers="Ctrl" Command="{StaticResource ExecuteCommand}" />
    </Window.InputBindings>
    <Window.CommandBindings>
        <CommandBinding Command="{StaticResource ExecuteCommand}" CanExecute="ExecuteCommand_CanExecute" Executed="ExecuteCommand_Executed"  />
    </Window.CommandBindings>
    <Grid>
    </Grid>
</Window>

在后面的代码中:

    private void ExecuteCommand_CanExecute(object sender, CanExecuteRoutedEventArgs e)
    {
        e.CanExecute = App.Current.Windows.Count > 1;
    }

    private void ExecuteCommand_Executed(object sender, ExecutedRoutedEventArgs e)
    {
        MessageBox.Show("Hello");
    }

希望有帮助。