2012-04-17 59 views
2

經過漫長而毫無結果的搜索之後,這是我的問題。我有一個WPF UserControl,它通過ElementHost顯示在WinForms表單中。發展幾乎完成,但仍有兩個小副作用。首先,如果我打開ContextMenu,我希望我可以通過光標鍵向上/向下選擇項目。但這個按鍵似乎不見了。 第二個是,如果我明確查詢Keyboard.Modifiers以確定是否按下Ctrl鍵,則Keyboard.Modifiers總是返回'None'。 我在這裏閱讀時,我認爲它與鍵盤或焦點狀態有關。我經常在這裏閱讀解決方案,以呼叫Integration.ElementHost.EnableModelessKeyboardInterop(窗口)但我沒有WPF窗口,我只是有一個WPF-UserControl。WinForms中的WPF用戶控件鍵盤問題

我創建了一個新的簡化項目,以將複雜度降至最低。背後

Public Class UserControl1 

    Private Sub MenuItem_Click(sender As System.Object, e As System.Windows.RoutedEventArgs) 
    If Keyboard.Modifiers = ModifierKeys.None Then 
     Debug.WriteLine("Modifiers = None") ' <= I am always here, even if I press Ctrl 
    Else 
     Debug.WriteLine("Modifiers = Not None") 
    End If 
    End Sub 
End Class 

我把這個控制到ElementHost的一個WinForms-Window內

XAML

<UserControl x:Class="UserControl1" 
      xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
      xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
      xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
      xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
      mc:Ignorable="d" 
      d:DesignHeight="50" d:DesignWidth="300"> 
    <TextBlock Text="This is a Demo-Text"> 
     <TextBlock.ContextMenu> 
      <ContextMenu> 
       <MenuItem Header="First" Click="MenuItem_Click"></MenuItem> 
       <MenuItem Header="Second"></MenuItem> 
      </ContextMenu> 
     </TextBlock.ContextMenu> 
    </TextBlock> 
</UserControl> 

代碼。如果我在WinForms-Window中有其他東西(當然是我可以捕獲焦點),我仍然可以通過在WPF-Control上右鍵單擊來打開ContextMenu,但向上或向下按下光標鍵不會選擇任何這兩個項目。如果我單擊第一個項目,按住Ctrl鍵,Keyboard.Modifiers仍返回Modifiers.None

+0

WPF和WinForms之間的集成不太嚴密。如果您無法將WinForms應用程序轉換爲WPF,則最好在WinForms控件(blech)中找出如何滿足您的需求。 – 2012-04-17 07:01:17

+0

@GregSansom我試圖擺脫WinForms,但它是一步到位。我在被替換的ListView控件中刪除了一些OwnerDraw(** choke **)沒有辦法回來;-) – Markus 2012-04-17 07:13:43

+0

我認爲你有一個WPF窗口 - 上下文菜單本身... – 2012-04-17 07:55:21

回答

0

可有人請打我的後腦勺?我一直在尋找一個解決方案了幾個小時,並張貼了這個問題後,我找到了答案是引人注意

關於文本菜單:

UserControl1.Focusable = True 

關於Keyboard.Modifiers:
我發現了Visual Basic的工作替代方案。

If My.Computer.Keyboard.CtrlKeyDown Then ... 

但我無法找到完整框架的通用等價物。如果有人發現一些替代品,請發出嗡嗡聲。