2009-09-17 4 views
10

Quando digito nella casella combinata che si apre automaticamente abilita l'elenco a discesaWPF: discesa di una casella combinata highlightes testo

searchComboBox.IsDropDownOpen = true; 

Il problema qui è - il testo viene evidenziato e la successiva keystrock sovrascrive il testo precedente.

Come è possibile disabilitare l'evidenziazione del testo all'apertura di ComboBox DropDown?

+0

Quale "casella combinata a discesa" stai parlando? – Trainee4Life

+3

Hai impostato false sulla proprietà IsTextSearchEnabled del comboBox ?? Disabilita la selezione del testo. la speranza che ti aiuterà. –

risposta

5

Meglio tardi che mai e se qualcun altro ha colpito questo problema potrebbe usarlo.

C'è spazio per questo se si sostituisce la casella combinata. Prima ottenere l'handle sulla casella di testo utilizzata nel modello e registrarsi all'evento selectionchanged.

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

    var element = GetTemplateChild("PART_EditableTextBox"); 
    if (element != null) 
    { 
    var textBox = (TextBox)element; 
    textBox.SelectionChanged += OnDropSelectionChanged; 
    } 
} 

private void OnDropSelectionChanged(object sender, RoutedEventArgs e) 
{ 
    // Your code 
} 

Quindi nel gestore eventi è possibile impostare nuovamente la selezione come si desidera che sia. Nel mio caso, stavo chiamando IsDropDownOpen nel codice. La selezione salvata viene quindi reinserita nel gestore eventi. Brutto ma ha fatto il trucco.

+0

Per favore, puoi scrivere il codice completo Ho lo stesso identico problema, ma sono nuovo in questo modo, per favore, esporre. Il mio elemento non è una casella di testo ma una casella combinata. – flexxxit

+0

Puoi inserire un codice di esempio in textbox_SelectionChanged? è così? TextBox tb = (TextBox) e.Source; if (tb! = Null) { tb.SelectionStart = 0; } –

0

Quando una casella di dialogo ottiene la messa a fuoco, è possibile disabilitare l'evidenziazione del testo (ovvero non selezionando alcun testo sull'evento GotFocus). Tuttavia, quando si pulldown la casella combinata, il sistema individuerà l'elemento nell'elenco e renderà l'elemento selezionato. Questo a sua volta mette in evidenza automaticamente il testo. Se capisco il comportamento che stai cercando, non credo che sia completamente possibile.

+0

hai ragione? non sembra possibile anche se utilizzo la proprietà IsTextSearchEnabled su false come menzionato da asim. – Panks

6

Avevo questo stesso problema e, come alcuni degli utenti che sono nuovi a WPF, ho faticato per ottenere la soluzione data da Einar Guðsteinsson al lavoro. Quindi a sostegno della sua risposta sto incollando qui i passaggi per farlo funzionare. (O più esattamente come ho fatto a farlo funzionare).

Per prima cosa creare una classe combobox personalizzata che eredita dalla classe Combobox. Vedi il codice qui sotto per la piena implementazione. È possibile modificare il codice in OnDropSelectionChanged in base alle proprie esigenze individuali.

spazio dei nomi MyCustomComboBoxApp { using System.Windows.Controls;

public class MyCustomComboBox : ComboBox 
{ 
    private int caretPosition; 

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

     var element = GetTemplateChild("PART_EditableTextBox"); 
     if (element != null) 
     { 
      var textBox = (TextBox)element; 
      textBox.SelectionChanged += OnDropSelectionChanged; 
     } 
    } 

    private void OnDropSelectionChanged(object sender, System.Windows.RoutedEventArgs e) 
    { 
     TextBox txt = (TextBox)sender; 

     if (base.IsDropDownOpen && txt.SelectionLength > 0) 
     { 
      txt.CaretIndex = caretPosition; 
     } 
     if (txt.SelectionLength == 0 && txt.CaretIndex != 0) 
     { 
      caretPosition = txt.CaretIndex; 
     } 
    } 

} 

Verificare che questa classe combo personalizzata esista nello stesso progetto. Allora puoi usare il codice qui sotto per fare riferimento a questa combo nell'interfaccia utente.

<Window x:Class="MyCustomComboBoxApp.MainWindow" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:cc="clr-namespace:MyCustomComboBoxApp" 
    Title="MainWindow" Height="350" Width="525" FocusManager.FocusedElement="{Binding ElementName=cb}"> 
<Grid> 
    <StackPanel Orientation="Vertical"> 
     <cc:MyCustomComboBox x:Name="cb" IsEditable="True" Height="20" Margin="10" IsTextSearchEnabled="False" KeyUp="cb_KeyUp"> 
      <ComboBoxItem>Toyota</ComboBoxItem> 
      <ComboBoxItem>Honda</ComboBoxItem> 
      <ComboBoxItem>Suzuki</ComboBoxItem> 
      <ComboBoxItem>Vauxhall</ComboBoxItem> 
     </cc:MyCustomComboBox> 
    </StackPanel> 
</Grid> 
</Window> 

Questo è tutto! Qualsiasi domanda, per favore chiedi! Farò del mio meglio per aiutare.

Grazie a Einar Guðsteinsson per la sua soluzione!

3

Penso che nella Soluzione fornita da Andrew N manchi qualcosa, perché quando ho provato l'evento Selezione modificata del TextBox stavo posizionando il punto di inserimento nel posto sbagliato. Quindi ho apportato questa modifica per risolverlo.

namespace MyCustomComboBoxApp { using System.Windows.Controls; 

public class MyCustomComboBox : ComboBox 
{ 
    private int caretPosition; 

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

     var element = GetTemplateChild("PART_EditableTextBox"); 
     if (element != null) 
     { 
      var textBox = (TextBox)element; 
      textBox.SelectionChanged += OnDropSelectionChanged; 
     } 
    } 

    private void OnDropSelectionChanged(object sender, System.Windows.RoutedEventArgs e) 
    { 
     TextBox txt = (TextBox)sender; 

     if (base.IsDropDownOpen && txt.SelectionLength > 0) 
     { 
      caretPosition = txt.SelectionLength; // caretPosition must be set to TextBox's SelectionLength 
      txt.CaretIndex = caretPosition; 
     } 
     if (txt.SelectionLength == 0 && txt.CaretIndex != 0) 
     { 
      caretPosition = txt.CaretIndex; 
     } 
    } 
} 
+0

Ottimo posto e aggiusta Mohammed! –

2

seguito alla risposta di clsturgeon, ho risolto il problema impostando la selezione quando si è verificato evento DropDownOpened:

private void ItemCBox_DropDownOpened(object sender, EventArgs e) 
{ 
    TextBox textBox = (TextBox)((ComboBox)sender).Template.FindName("PART_EditableTextBox", (ComboBox)sender); 
    textBox.SelectionStart = ((ComboBox)sender).Text.Length; 
    textBox.SelectionLength = 0; 
} 
+1

Funziona, la soluzione più breve che ho trovato, grazie: D – Kreshnik

+0

Ora per vedere come rendere questo in DependencyProperty ... – KornMuffin