我在WinForm中有一个WPF UserControl:
绿色部分是WPF UserControl ..
UserControl代码如下:
public partial class UserControl1 : UserControl
{
public UserControl1()
{
InitializeComponent();
}
protected override void OnPreviewKeyUp(KeyEventArgs e)
{
base.OnPreviewKeyUp(e);
MessageBox.Show(e.Key.ToString());
}
}
XAML:
<UserControl>
<Grid Background="DarkGreen">
<Label Content="Label" Margin="64,105,0,0" Name="label1" />
</Grid>
</UserControl>
每次打开tabPage2时,我都需要“听”键盘命令。
实际代码不起作用(在tabPage2打开的情况下按键盘时会显示任何消息)。
为什么?
更新了一些WinForms代码:
private void tabControl1_SelectedIndexChanged(object sender, EventArgs e)
{
if (this.tabControl1.SelectedIndex == 1)
{
ElementHost elHost = (this.tabControl1.SelectedTab.Controls[0] as ElementHost);
bool success = false;
if (elHost != null)
{
success = elHost.Focus();
Console.WriteLine("Success : {0}", success);
}
}
}
结果:
Function: WindowsFormsApplication2.Form1.tabPage2_Enter Function: WindowsFormsApplication2.Form1.tabControl1_SelectedIndexChanged Success : True
但是,结果是相同的:WPF UserControl捕获任何keyUp。
答案 0 :(得分:1)
仅在ElementHost具有焦点时处理事件。有关详细信息,请参阅here。
private void tabControl1_SelectedIndexChanged(object sender, EventArgs e)
{
(this.tabControl1.SelectedTab.Controls[0] as ElementHost).Focus();
}
答案 1 :(得分:0)
这是因为WinForms和WPF之间的消息传递不同。
这是我为此提出的解决方案。
在WinForms控件中,收听WPF控件的关键事件
_wpfHost.Child = MyWpfControl;
MyWpfControl.Name = "MyWpfControl";
this.MyWpfControl.PreviewKeyDown += WpfControlOnPreviewKeyDown;
在WpfControlOnPreviewKeyDown
做你的逻辑。我不得不将事件冒泡到需要键盘事件的另一个WinForms控件。
private void WpfControlOnPreviewKeyDown(object sender, KeyEventArgs args)
{
if (args.Key != System.Windows.Input.Key.Enter) return;
// bubble up the event
var message = new System.Windows.Forms.Message { WParam = (IntPtr)Keys.Enter };
this.ProcessKeyPreview(ref message);
}
我只需要输入密钥。