2013-03-19 16 views
7

WPF uygulamasında bir metin kutusu içeren bir menü öğesi istiyorum. Aşağıdaki kodu kullanarak bunu yapmak başarmış:WPF TextBox MenuItem fareyi hareket ettirirken odağı kaybedecek

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

Bu kod beklediğim gibi menü öğesini görüntüler ama uzak metin kutusuna bazı değer yazmaya başlayın ve ardından fareyi (tıklanmamasıyla) taşırsanız metin kutusu menü öğesi, metin kutusu odağı kaybeder ve metin kutusuna tekrar tıklayana kadar yazmaya devam edemiyorum. WinForms'taki bir metin kutusu menü öğesiyle aynı davranışı nasıl yapabilirim? Yani, metin kutusu, kullanıcı metin kutusunun dışına tıklarsa veya sekme tuşuna basarsa yalnızca odağı kaybeder.

Şimdiden teşekkürler.

cevap

5

ben size menü kontrolünü nasıl kullandıklarını emin değilim yazdığı gibi. Ama belki snipped bu kod size yardımcı veya size bir ipucu verebilir:

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

ve uygun yöntem: Bu cevap size yardımcı olmak için muhtemelen çok geç olduğunu biliyorum

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

Bu sorunumu çözdü, çok teşekkürler! – dbostream

+0

Rica ederim! :-) – rhe1980

+1

Aynı menüde birden fazla varsa, e.Handled yalnızca (e.NewFocus MenuItem ise) ayarlanmasına yardımcı olur. Böylece aynı menüdeki farklı bir TextBox'a tıklayabilirsiniz. –

0

Belki bu yardımcı olur:

<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

Korkarım ki değil, ama yine de teşekkürler. Ben fareyi tıklattığımda davranış zaten iyi, sorun ben odağı kaybeder ve ben artık yazamaz çünkü imleci metin kutusu menü öğesi dışında hareket ettirdiğimde. – dbostream

+0

oops, benim hatam. Sorunun doğru olmadı üzgünüm. Yapıştırılan kodunuzu denedim ve anlattığınız davranışı almıyorum. Daha fazla bilgi var mı? (MenuItem öğesinin xaml öğesi, vb.) – rhe1980

1

, ama belki onu Bu soruna yönelik düzeltmeleri arayan herkes yardımcı olacaktır. Ayrıca, MenuItems üzerinde Focusable=false ayarı da çalışır. Hala tıklanmalarına izin verir ve içerdiği kontrollerin odaklanmasını sağlar. Bununla birlikte, yalnızca bir klavye kullanarak menüye erişme ve bir erişilebilirlik sorunu sunma özelliğini devre dışı bırakır.

Erişilebilirlik sorunu, her menü öğesine odaklanabilir bir öğe verilerek küçük bir yaratıcılık ile çözülebilir. Örneğin:

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

FocusVisualStyle="{x:Null}" kod aksi görünür noktalı odak gizlemek için gereklidir (ve bir menüde yersiz görünüyor).