1

WinForm アプリケーションから呼び出されたときに WPF KeyBindings を機能させるには、いくつかの支援が必要です。問題を実証するための基本的な部分と思われるものを作成しました。それが役立つ場合は、サンプル アプリケーションを提供できます。

WinForm アプリケーションは、WPF を呼び出すボタンを持つフォームを開始します。

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    Dim view As New WpfPart.MainWindow
    System.Windows.Forms.Integration.ElementHost.EnableModelessKeyboardInterop(view)
    view.ShowDialog()
End Sub

WPF ビューを使用すると、そのビュー モデルが作成され、キービングが設定されます。

<Window x:Class="WpfPart.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:vm="clr-namespace:WpfPart.ViewModels"
    Title="MainWindow" Height="350" Width="525">
<Window.DataContext>
    <vm:MainWindowViewModel />
</Window.DataContext>
<Window.InputBindings>
    <KeyBinding Key="Escape" Command="{Binding OpenCommand}" Modifiers="Control" />
</Window.InputBindings>
<Grid>

</Grid>

ViewModel は DelagateCommand を使用して、うまくいけばすべてをリンクします

using System;
using System.Windows;
using System.Windows.Input;
using WpfPart.Commands;

namespace WpfPart.ViewModels
{
class MainWindowViewModel
{
    private readonly ICommand openCommand;

    public MainWindowViewModel()
    {
        openCommand = new DelegateCommand(Open, CanOpenCommand);
    }

    public ICommand OpenCommand { get { return openCommand; } }
    private bool CanOpenCommand(object state)
    {
        return true;
    }

    private void Open(object state)
    {
        MessageBox.Show("OpenCommand executed.");
    }
}
}

キーを押しても何も起こらないのでしょうか?!?

4

2 に答える 2

1

KeyBinding を機能させるには、CommandReference を Window.Resources に追加し、(コマンドではなく) KeyBinding から CommandReference を参照する必要があります。

また、Control-X を使用して、Control-Escape に対応する Windows の [スタート] ボタンを開かないようにしました。

質問に基づいて使用できる XAML は次のとおりです。

<Window.Resources>
    <!-- Allows a KeyBinding to be associated with a command defined in the View Model  -->
    <c:CommandReference x:Key="OpenCommandReference" Command="{Binding OpenCommand}" />
</Window.Resources>
<Window.InputBindings>
    <KeyBinding Key="X" Command="{StaticResource OpenCommandReference}" Modifiers="Control" />
</Window.InputBindings>
于 2010-10-06T22:49:26.010 に答える
0

miプロジェクトで私は解決策を使用しました:ListViewにはコマンドCmdDeleteを持つDummyViewModelのアイテムがあり、選択したアイテムの下でこのコマンドを呼び出す必要があります。

<Grid>
    <Button x:Name="DeleteCmdReference" Visibility="Collapsed" Command="{Binding Source={x:Reference MyListView},Path=SelectedItem.CmdDelete}" />
    <ListView x:Name="MyListView" ...="" >
      <ListView.InputBindings>
        <KeyBinding Key="Delete" Command="{Binding ElementName=DeleteCmdReference,Path=Command}"/>
      </ListView.InputBindings>
    </ListView>
  </Grid>
于 2013-04-17T12:26:07.763 に答える