我在.net4.5 wpf中的wpf WindowsFormsHost中托管一个Windows窗体控件,比如
<Grid MouseDown="Grid_MouseDown" Background="#FFE85050">
<WindowsFormsHost HorizontalAlignment="Left" Height="244"
VerticalAlignment="Top" Width="335"
MouseDown="WindowsFormsHost_MouseDown">
<ctrl:UserControl1 x:Name="aa" MouseClick="aa_MouseClick"/>
</WindowsFormsHost>
</Grid>
aa_MouseClick正确触发但是WindowsFormsHost_MouseDown和Grid_MouseDown从不触发(windows窗体控件吃掉事件),我该如何解决这个问题呢?
答案 0 :(得分:0)
WPF
和WinForms
的事件处理策略完全不同。 Winforms中处理的MouseDown
事件无法传播到WPF控件。 WPF uses routed event instead of old event handling of WinForms.
甚至事件处理程序的签名也不同。您可以做的是在MouseDown
上挂钩WinForms control
,并且可以do your stuff from there
。
OR
您可以尝试使用提到的here方法,但从WPF到Winforms也是如此,但也适用于您的情况。
答案 1 :(得分:0)
我的目的是创建一个窗口hwnd来呈现某些内容,但不关心事件 这是我现在使用的解决方案
public class RenderHwndHost : HwndHost
{
public delegate void AfterSizeChangedHandler();
internal const int
WS_CHILD = 0x40000000,
WS_VISIBLE = 0x10000000,
LBS_NOTIFY = 0x00000001,
HOST_ID = 0x00000002,
LISTBOX_ID = 0x00000001,
WS_VSCROLL = 0x00200000,
WS_BORDER = 0x00800000;
private IntPtr hwndHost;
[DllImport("user32.dll", EntryPoint = "DestroyWindow", CharSet = CharSet.Unicode)]
internal static extern bool DestroyWindow(IntPtr hwnd);
[DllImport("user32.dll", EntryPoint = "CreateWindowEx", CharSet = CharSet.Unicode)]
internal static extern IntPtr CreateWindowEx(int dwExStyle,
string lpszClassName,
string lpszWindowName,
int style,
int x, int y,
int width, int height,
IntPtr hwndParent,
IntPtr hMenu,
IntPtr hInst,
[MarshalAs(UnmanagedType.AsAny)] object pvParam);
protected override IntPtr WndProc(IntPtr hwnd, int msg, IntPtr wParam, IntPtr lParam, ref bool handled)
{
handled = false;
return IntPtr.Zero;
}
protected override void DestroyWindowCore(HandleRef hwnd)
{
DestroyWindow(hwnd.Handle);
}
protected override void OnRenderSizeChanged(SizeChangedInfo sizeInfo)
{
base.OnRenderSizeChanged(sizeInfo);
if (AfterSizeChanged != null)
{
Dispatcher.BeginInvoke(
DispatcherPriority.Normal,
new Action(() => AfterSizeChanged()));
}
}
public event AfterSizeChangedHandler AfterSizeChanged;
protected override HandleRef BuildWindowCore(HandleRef hwndParent)
{
hwndHost = CreateWindowEx(0, "static", "",
WS_CHILD,
0, 0,
100, 100,
hwndParent.Handle,
(IntPtr) HOST_ID,
IntPtr.Zero,
0);
return new HandleRef(this, hwndHost);
}