2013-12-04 2 views
0

Я у себя контроль окна формы в МОФ WindowsFormsHost в .net4.5 МОФЕ, как.net 4.5 мыши МОФ WindowsFormsHost хостинг контроль окна формы

<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 Никогда не пожары (контроль формы окна есть событие), как я могу исправить эту проблему?

ответ

0

Обработка событий startegy WPF и WinForms совершенно другая. MouseDown Событие, обрабатываемое в Winforms, не может быть распространено до элемента управления WPF. WPF uses routed event instead of old event handling of WinForms.

Даже обработчики событий отличаются подписью. Что вы можете сделать, это крюк MouseDown событие на WinForms control и может do your stuff from there.

ИЛИ

Вы можете попробовать подход упоминается here, другим своим путем вокруг, хотя из WPF в Winforms, но может быть применен в вашей ситуации, а также.

+0

это разные, я знаю, но есть ли способ может пройти сообщение о событии (сообщение окна) непосредственно в wpf, но не winforms внутри WindowsFormsHost? –

+0

Нет такого метода. Как я упоминал в другом подходе, вам нужно создать свое настраиваемое событие в WinForms и подключиться к этому событию в WPF. Поднять это событие от обработчика WinForms и прослушать в WPF. –

+0

Спасибо, есть HwndHost, в основном я могу использовать его для достижения той же цели, и если переопределить WndProc, чтобы не обрабатывать сообщение окна, wpf может получить событие –

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); 
    } 
Смежные вопросы