2013-03-19 51 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中的文本框菜單項相同的行爲?也就是說,如果用戶在文本框外單擊或點擊Tab鍵,文本框只會失去焦點。

在此先感謝。

回答

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 2013-03-19 13:38:06

+0

不客氣! :-) – rhe1980 2013-03-19 13:50:09

+1

如果您在同一個菜單中有多個選項,僅當(e.NewFocus是MenuItem)時纔有助於設置e.Handled。這樣,您仍然可以在同一個菜單中單擊不同的文本框。 – 2015-12-30 20:13:02

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 2013-03-19 12:22:14

+0

哎呀,我的錯。我沒有解決你的問題,對不起。我試過你的粘貼代碼,我沒有得到你描述的行爲。你有更多的信息嗎? (周圍MenuItem的xaml元素等) – rhe1980 2013-03-19 12:30:38

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}"代碼需要隱藏,否則將出現點對焦(和看起來不合適在菜單)。