WPF

2010-06-03 39 views
6

में एक संपादन योग्य कॉम्बोबॉक्स पर फ़ोकस कैसे जोड़ें I wpf में एक संपादन योग्य कॉम्बोबॉक्स का उपयोग कर रहा हूं लेकिन जब मैं सी # कोड से फ़ोकस सेट करने का प्रयास करता हूं, तो यह केवल चयन दिखाता है। लेकिन मैं संपादन विकल्प के लिए जाना चाहता हूं (कर्सर उपयोगकर्ता इनपुट के लिए प्रदर्शित होना चाहिए)।WPF

+0

आपके कोड का एक उदाहरण दे सकता है? पीएस: मैंने तुम्हें कम नहीं किया। – Anvaka

उत्तर

3

आप ComboBox से पाने की कोशिश करते हैं और इस तरह, आंतरिक पाठ बॉक्स का उपयोग हो सकता है: अपने कोड में

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 
    } 

} 

आप इसे इस तरह का प्रयोग करेंगे:

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

यह समाधान थोड़ा खतरनाक है, तथापि, क्योंकि डब्ल्यूपीएफ के आने वाले संस्करणों में, माइक्रोसॉफ्ट एक गॉटकेबोर्ड फोकस इवेंट हैंडलर (या इसी तरह के इवेंट हैंडलर) को जोड़ने का भी फैसला कर सकता है, जो कि माइक्रंबोबॉक्स में इवेंट हैंडलर के साथ संघर्ष में हो सकता है। ऊपर मैं एक थोड़ा सरल समाधान के साथ आया था

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

आप इस कोड की कोशिश कर सकते हैं। निर्माता या ContextChangedHandler में कोड नियंत्रण के लिए इंतज़ार कर रहा है फोकस भी हैंडलर मैं अंत

शुरू से सभी पाठ का चयन ध्यान में

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

फिर यूआई तत्व पर डालने से पहले लोड करने के लिए

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 में combobox संपादन योग्य है। जब उपयोगकर्ता एक महत्वपूर्ण यह पिछले मान

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

यहां उद्धृत कोई कोड काम नहीं कर रहा है। –

+2

@RAJK वह कोड मेरे लिए पूरी तरह से काम किया। खिड़की पहली बार प्रदर्शित होने पर यह एक संपादन योग्य combobox पर ध्यान केंद्रित करने की समस्या ठीक से हल करता है। स्पष्ट रूप से यह नहीं बताया गया है कि आपको कोड को संपादन योग्य combobox युक्त विंडो की लोड की गई घटना में रखना होगा। –

+0

बिल्कुल सही! मुझे बहुत सारी समस्याएं हल हुईं! आपको बहुत - बहुत धन्यवाद! –

3

user128300 के जवाब के आधार पर:

0

को रीसेट है Rikker Serg के जवाब के आधार पर टाइप सभी पाठ चयन करके, आप (InitializeComponent के बाद) अपने निर्माता में उस कोड का उपयोग करें और यह बजाय प्रेषण कस्टम बनाने के लिए की आवश्यकता होगी, के कर सकते हैं नियंत्रण या घटना हैंडलर।

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; 
     } 
    })); 

} 
संबंधित मुद्दे