2011-11-08 16 views
1

私は、ContextMenuの中にあるMenuItemのControlTemplateを持つテキストボックスを持っています。テキストボックスはうまく動作し、正しく入力することができます。しかし、コンテキストメニューの他のメニュー項目の上にマウスを移動すると、フォーカスが要求され、テキストボックスからフォーカスが失われます。この時点で、入力を続行するにはテキストボックスに戻る必要があります。ContextMenuのテキストボックスがマウスの移動にフォーカスを失う

この問題を解決するパターンがありますか?

おかげ

+0

いくつかコードを投稿してください。私はあなたの実装を試しましたが、私はこの問題を抱えていません – MaRuf

+0

メニュー項目を大幅に修正しましたので、ここでデモするのは難しいです。あなたが問題を見ていないなら、多分私たちのスタイリングのために。 – Dean

答えて

0

あなたがフォーカスを取り戻すしたい場合は、以下のように入力することができます。

textBox.CaptureMouse(); 
textBox.ReleaseMouseCapture(); 

私はそれがテキストボックスにフォーカスをキャッチすることができると思います。 PriviewGoTKeyboardFocusイベントのe.Handled = trueを設定する(マウス入力に)フォーカスをキャプチャすることができる他のすべてのメニュー項目については、

+0

問題は、テキストボックスがフォーカスを失うことです。 CaptureMouseがどのように役立つのかは分かりません。なぜなら、CaptureMouseはまだフォーカスを失う可能性があるからです。 – Dean

+0

textBoxに名前を付けた後、menuItem_PreviewGotKeyboardFocusでCaptureMouseとReleaseMouseCaptureコードを使用できますか? – Diainwater

0

まあ、いくつかの異なるものを試した後、私は仕事に何かを得ました:

void menuItem_PreviewGotKeyboardFocus(object sender, KeyboardFocusChangedEventArgs e) 
{ 
    e.Handled = true; 
} 

コンテキストメニューのすべてのメニュー項目をループすることによって、ウィンドウベースクラスから自動的にこれを行うことができます。これには、テキストボックスを挿入するメニューアイテムのハイジャックが必要です。

void contextMenu_Opened(object sender, RoutedEventArgs e) 

{ 
    ContextMenu contextMenu = sender as ContextMenu; 
    foreach (FrameworkElement frameworkElement in contextMenu.Items) 
    { 
    if (frameworkElement is MenuItem) 
    { 
     MenuItem menuItem = (frameworkElement as MenuItem); 
     if (!(menuItem.Tag != null && menuItem.Tag.ToString() == "MaintainFocus")) 
     menuItem.PreviewGotKeyboardFocus += new KeyboardFocusChangedEventHandler(menuItem_PreviewGotKeyboardFocus); 
    } 
    } 
} 
void contextMenu_Closed(object sender, RoutedEventArgs e) 
{ 
    ContextMenu contextMenu = sender as ContextMenu; 
    foreach (FrameworkElement frameworkElement in contextMenu.Items) 
    { 
    if (frameworkElement is MenuItem) 
    { 
     MenuItem menuItem = (frameworkElement as MenuItem); 
     if (!(menuItem.Tag != null && menuItem.Tag.ToString() == "MaintainFocus")) 
     menuItem.PreviewGotKeyboardFocus -= menuItem_PreviewGotKeyboardFocus; 
    } 
    } 
} 
関連する問題