2013-03-19 25 views
7

私のWPFアプリケーションでは、メニュー項目にテキストボックスが必要です。私は、次のコードを使用して、これを行うために管理している:WPF TextBox MenuItemはマウスを動かすとフォーカスが失われます

<Menu Height="23" HorizontalAlignment="Stretch" Name="MainMenu" VerticalAlignment="Top"> 
    <MenuItem Header="File"> 
     <MenuItem Header="Exit" Click="menuItemExit_Click" /> 
    </MenuItem> 
    <MenuItem Header="Settings"> 
     <MenuItem Header="Some setting" IsCheckable="True" /> 
     <Separator /> 
     <MenuItem> 
      <MenuItem.Header> 
       <Grid> 
        <Grid.ColumnDefinitions> 
         <ColumnDefinition Width="Auto" /> 
         <ColumnDefinition /> 
        </Grid.ColumnDefinitions> 
        <Label Content="Some value:" Margin="0,3,6,0" Padding="0" /> 
        <TextBox Margin="0,0,0,6" Grid.Column="1" /> 
       </Grid> 
      </MenuItem.Header> 
     </MenuItem> 
    </MenuItem> 
</Menu> 

このコードは、私が期待されるように、メニュー項目を表示しますが、私は、テキストボックスにいくつかの値を入力を開始してから、マウスを移動すると離れてから(クリックしません)テキストボックスメニュー項目をクリックすると、テキストボックスのフォーカスが失われ、テキストボックスを再度クリックするまで入力を続行できません。 WinFormsのテキストボックスメニュー項目と同じ動作をどうやって達成できますか?つまり、ユーザーがテキストボックスの外側をクリックしたり、タブキーを押すと、テキストボックスのフォーカスが失われます。

ありがとうございます。

答えて

5

私は私はあなたがあなたのメニューコントロールを使用する方法を確認していない書いたように。 しかし、おそらく、このコード切り取らはあなたを助けるか、あなたにヒントを与えることができます。

<TextBox Margin="0,0,0,6" Grid.Column="1" PreviewLostKeyboardFocus="OnPreviewLostKeyboardFocus"/> 

と記載の方法:

private void OnPreviewLostKeyboardFocus(object sender, KeyboardFocusChangedEventArgs e) 
    { 
    if (MainMenu.IsKeyboardFocusWithin) 
    { 
     e.Handled = true; 
    } 
    } 
+0

これは私の問題を修正しました。ありがとうございます! – dbostream

+0

よろしくお願いします! :-) – rhe1980

+1

同じメニューに複数のメニューがある場合は、(e.NewFocusがMenuItemの場合のみ)e.Handledを設定するのに役立ちます。こうすることで、同じメニューの別のTextBoxをクリックすることができます。 –

0

多分これは役立ちます:

<MenuItem StaysOpenOnClick="True"> 
     <MenuItem.Header> 
      <Grid> 
       <Grid.ColumnDefinitions> 
        <ColumnDefinition Width="Auto" /> 
        <ColumnDefinition /> 
       </Grid.ColumnDefinitions> 
       <Label Content="Some value:" Margin="0,3,6,0" Padding="0" /> 
       <TextBox Margin="0,0,0,6" Grid.Column="1" /> 
      </Grid> 
     </MenuItem.Header> 
    </MenuItem> 
+0

私は恐れますが、とにかく感謝します。マウスをクリックしたときの動作は良好です。フォーカスが失われて入力できなくなるため、テキストボックスのメニュー項目の外にカーソルを移動すると問題が発生します。 – dbostream

+0

おっと、私のせいです。私はあなたの質問を正しくしなかった、申し訳ありません。私はあなたの貼り付けられたコードを試して、私はあなたが記述した動作を取得しないでください。さらなる情報がありますか? (MenuItemなどのxaml要素を取り囲んで) – rhe1980

1

私はこの答えはおそらくあなたを助けるためにあまりにも遅ですけど、多分それこの問題の修正を探している人を助ける。

MenuItemsにFocusable=falseを設定することもできます。それでも、それらをクリックすることができ、含まれているコントロールにフォーカスを当てることができます。ただし、キーボードのみを使用してメニューをナビゲートする機能が無効になり、アクセシビリティの問題が発生します。

しかし、アクセシビリティの問題は、すべてのメニュー項目にフォーカス可能な要素を与えることで、少しの創造性で解決できます。たとえば:

<MenuItem Focusable="False"> 
    <MenuItem.Header> 
     <StackPanel Orientation="Horizontal" Focusable="True" FocusVisualStyle="{x:Null}"> 
      <TextBlock Text="Do something!" /> 
     </StackPanel> 
    </MenuItem.Header> 
</MenuItem> 

FocusVisualStyle="{x:Null}"コードは、そうでないと思われる点線のフォーカスを非表示にすることが必要である(とメニューに場違いに見えます)。

関連する問題