2013-03-19 26 views
7

W mojej aplikacji WPF chcę, aby element menu miał pole tekstowe. Udało mi się to zrobić za pomocą następującego kodu:WPF TextBox MenuItem traci ostrość podczas przenoszenia myszy

<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> 

Ten kod wyświetla menu jak się spodziewałem, ale jeśli zacznę wpisywać jakąś wartość w polu tekstowym, a następnie przesuń mysz (nie klikając) od element menu pola tekstowego, pole tekstowe traci ostrość i nie mogę kontynuować pisania, dopóki nie kliknę pola tekstowego ponownie. Jak mogę osiągnąć takie samo zachowanie, jak element menu tekstowego w WinForms? Oznacza to, że pole tekstowe traci ostrość tylko wtedy, gdy użytkownik kliknie poza polem tekstowym lub dotknie klawisza tabulatora.

Z góry dziękuję.

Odpowiedz

5

Jak pisałem nie jestem pewien, jak można wykorzystać sterowanie menu. Ale może ten kod snipped może pomóc lub dać podpowiedź:

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

i sposób według:

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

To naprawiło mój problem, wielkie dzięki! – dbostream

+0

Nie ma za co! :-) – rhe1980

+1

Jeśli masz więcej niż jeden w tym samym menu, pomaga ustawić e.Handled tylko wtedy, gdy (e.NewFocus jest MenuItem). W ten sposób nadal możesz kliknąć na inny TextBox w tym samym Menu. –

0

Może to pomoże:

<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

Obawiam się, że tak nie jest, ale dzięki to. Zachowanie po kliknięciu myszą jest już dobre, problem polega na tym, że przesuwaję kursor poza element menu pola tekstowego, ponieważ traci on ostrość i nie mogę już pisać. – dbostream

+0

oops, moja wina. Nie odpowiedziałem na twoje pytanie, przepraszam. Próbowałem twojego wklejonego kodu i nie rozumiem zachowania, które opisałeś. Czy masz jakieś dodatkowe informacje? (otaczający element xaml MenuItem, itp.) – rhe1980

1

znam odpowiedź ta jest prawdopodobnie zbyt późno, aby pomóc, ale może go Pomoże to każdemu, kto będzie szukał poprawek do tego problemu.

Ustawienie Focusable=false na MenuItems również działa. Nadal pozwala im na kliknięcie i pozwala skoncentrować się na zawartych w nich kontrolkach. Jednak wyłącza możliwość poruszania się po menu za pomocą klawiatury, wprowadzając problem z dostępnością.

Problem dostępności można rozwiązać przy odrobinie kreatywności, nadając każdemu elementowi menu element, który można ustawić. Na przykład: jest wymagane

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

Kod FocusVisualStyle="{x:Null}" ukryć przerywana skupienie które w przeciwnym razie pojawi się (i wygląda na miejscu w menu).