WPF

2010-06-03 19 views
6

'da düzenlenebilir bir ComboBox'a nasıl odak eklenir Wpf'de düzenlenebilir bir ComboBox kullanıyorum ancak C# kodundan odağı ayarlamaya çalıştığımda, yalnızca seçim gösterilir. ama düzenleme seçeneği için gitmek istiyorum (imleç kullanıcı girişi için göstermelidir).WPF

+0

Kodunuzun bir örneği verilebilir mi? Not: Seni reddetmedim. – Anvaka

cevap

3

Sen ComboBox doğan denemek ve bu gibi iç TextBox erişmek olabilir:

public class MyComboBox : ComboBox 
{ 
    TextBox _textBox; 

    public override void OnApplyTemplate() 
    { 
     base.OnApplyTemplate(); 

     _textBox = Template.FindName("PART_EditableTextBox", this) as TextBox; 
     if (_textBox != null) 
     { 
      _textBox.GotKeyboardFocus += _textBox_GotFocus; 
      this.Unloaded += MyComboBox_Unloaded; 
     } 
    } 

    void MyComboBox_Unloaded(object sender, System.Windows.RoutedEventArgs e) 
    { 
     _textBox.GotKeyboardFocus -= _textBox_GotFocus; 
     this.Unloaded -= MyComboBox_Unloaded; 
    } 

    void _textBox_GotFocus(object sender, System.Windows.RoutedEventArgs e) 
    { 
     _textBox.Select(_textBox.Text.Length, 0); // set caret to end of text 
    } 

} 

Kodunuzda bu gibi kullanabilirsiniz olacaktır:

<Window x:Class="EditableCbox.Window1" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:local="clr-namespace:EditableCbox" 
    Title="Window1" Height="300" Width="300"> 
    ... 
     <local:MyComboBox x:Name="myComboBox" IsEditable="True" Grid.Row="0" Margin="4"> 
      <ComboBoxItem>Alpha</ComboBoxItem> 
      <ComboBoxItem>Beta</ComboBoxItem> 
      <ComboBoxItem>Gamma</ComboBoxItem> 
     </local:MyComboBox> 
    ... 
</Window> 

Bu çözüm biraz tehlikeli, ancak, WPF'nin gelecek sürümlerinde Microsoft, MyComboBox'taki olay işleyicisiyle çakışabilecek bir GotKeyboardFocus olay işleyicisi (veya benzer olay işleyicileri) eklemeye de karar verebilir. Ben biraz daha basit çözüm geldi yukarıda

 var textBox = (comboBox.Template.FindName("PART_EditableTextBox", comboBox) as TextBox); 
     if (textBox != null) 
     { 
      textBox.Focus(); 
      textBox.SelectionStart = textBox.Text.Length; 
     } 
9

Bu kodu deneyebilirsiniz. yapıcısı veya ContextChangedHandler olarak kod denetimi bekliyor odakta

myComboBox.GotFocus += MyComboBoxGotFocus; 
myComboBox.Loaded += (o, args) => { myComboBox.Focus(); }; 

Sonra UI öğesi üzerinde Sonuna

baştan tüm metni seçmek bile işleyici odağı koymadan önce yüklenecek
private void MyComboBoxGotFocus(object sender, RoutedEventArgs e) 
{ 
    var textBox = myComboBox.Template.FindName("PART_EditableTextBox", myComboBox) as TextBox; 
    if (textBox != null) 
     textBox.Select(0, textBox.Text.Length); 
} 

Xaml'de, combobox düzenlenebilir. Kullanıcı bu Rikker Serg cevabı dayanarak önceki değerini

<ComboBox x:Name="myComboBox" IsEditable="True" /> 
+1

kod numarası burada çalışmıyor. –

+2

@RAJK Bu kod benim için mükemmel çalıştı. Bir pencere ilk görüntülendiğinde, düzenlenebilir bir combobox üzerinde odaklanma ihtiyacını çözer. Açıkça belirtilmeyen, kodu, düzenlenebilir birleşik giriş kutusu içeren pencerenin Loaded olayına koymanız gerektiğidir. –

+0

Mükemmel! Bana çok ve çok fazla sorun çözüldü! Çok teşekkür ederim! –

3

user128300 cevabını göre:

0

sıfırlıyor bir anahtar yazdığınızda tüm metin seçerek, (InitializeComponent sonra) Yapıcınızda bu kodu kullanabilir ve özel oluşturmak için ihtiyaç duyma bunu yerine sevk kontroller veya olay işleyicileri.

public NewMessageWindow() 
{ 
    InitializeComponent(); 

    Dispatcher.BeginInvoke(new Action(() => 
    { 
     var textBox = myComboBox.Template.FindName("PART_EditableTextBox", cbUsers) as TextBox; 
     if (textBox != null) 
     { 
      textBox.Focus(); 
      textBox.SelectionStart = textBox.Text.Length; 
     } 
    })); 

}