我有带有选项卡控件的 Windows 窗体窗口,其中一个选项卡主机 ElementHost 以 ContentControl 作为子元素。此控件具有输入绑定的集合,这些输入绑定仅在任何子元素具有输入焦点时才起作用,但如果焦点丢失,它们将不再做出反应。在这种情况下是否可以在更高级别上定义这些输入绑定?
问问题
774 次
1 回答
3
一种解决方案可能是将(隧道)键盘和/或鼠标事件从 Win Forms 传递到 WPF 主机。我做了以下概念证明。它有效,但有局限性,需要更多的工作。首先,您需要一个派生自ElementHost的类。您应该在应用程序中使用它而不是标准ElementHost。这个新的自定义类将只有一个附加方法ProcessWinFormsKeys,它将 WinForms 特定键映射到 WPF 使用的键。然后它会找到一个合适的输入绑定并执行它。
public class CustomElementHost : ElementHost
{
public void ProcessWinFormsKeys(Keys keys, Keys modifiers)
{
var key = KeyInterop.KeyFromVirtualKey((int)keys);
var modifier = System.Windows.Input.ModifierKeys.None;
if ((modifiers & Keys.Control) != 0)
modifier |= System.Windows.Input.ModifierKeys.Control;
if ((modifiers & Keys.Shift) != 0)
modifier |= System.Windows.Input.ModifierKeys.Shift;
if ((modifiers & Keys.Alt) != 0)
modifier |= System.Windows.Input.ModifierKeys.Alt;
foreach (InputBinding inputBinding in Child.InputBindings)
{
var keyGesture = inputBinding.Gesture as KeyGesture;
if (keyGesture == null)
continue;
if(keyGesture.Key == key && keyGesture.Modifiers == modifier)
if(inputBinding.Command.CanExecute(inputBinding.CommandParameter))
inputBinding.Command.Execute(inputBinding.CommandParameter);
}
}
}
然后在包含CustomElementHost实例的表单中,您应该订阅KeyDown事件并在处理程序中调用ProcessWinFormsKeys方法:
public Form()
{
InitializeComponent();
KeyPreview = true;
KeyDown += Form_KeyDown;
...
}
void Form_KeyDown(object sender, KeyEventArgs e)
{
elementHost.ProcessWinFormsKeys(e.KeyCode, e.Modifiers);
}
另一种解决方案可能是使用全局热键。它将需要使用user32.dll 中的RegisterHotKey函数。但是,我不确定它是否适用于ElementHost。如果你想尝试,stackoverflow 上有几个问题和 Internet 上的数十篇文章。
于 2014-09-09T11:53:23.760 回答