.net 4.5鼠标事件的wpf WindowsFormsHost托管一个Windows窗体控件

时间:2013-12-04 17:58:21

标签: wpf windowsformshost

我在.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窗体控件吃掉事件),我该如何解决这个问题呢?

2 个答案:

答案 0 :(得分:0)

答案 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);
    }