2009-09-17 8 views
10

Lorsque je tape dans le combobox j'ouvre automatiquement permet la liste déroulanteWPF: Dropdown d'un Combobox highlightes le texte

searchComboBox.IsDropDownOpen = true; 

Le problème est ici - le texte est mis en surbrillance et la prochaine keystrock remplace le texte précédent. Comment puis-je désactiver la mise en surbrillance du texte lorsque ComboBox DropDown s'ouvre?

+0

qui « ComboBox DropDown » parlez-vous? – Trainee4Life

+3

Avez-vous défini false à la propriété IsTextSearchEnabled de la zone de liste déroulante? Cela désactivera la sélection du texte. espérons que cela aidera. –

Répondre

5

Mieux vaut tard que jamais et si quelqu'un d'autre a frappé ce proplem, il pourrait l'utiliser.

Il y a loin de faire ceci si vous surchargez combobox. D'abord, récupérez le handle sur la zone de texte utilisée dans le modèle et inscrivez-vous à l'événement selectionchanged. Puis, dans le gestionnaire d'événements, vous pouvez redéfinir la sélection comme vous le souhaitez. Dans mon cas, j'appelais IsDropDownOpen dans le code. La sélection sauvegardée y est ensuite remise dans le gestionnaire d'événements. Laid mais a fait l'affaire.

+0

S'il vous plaît Pouvez-vous écrire le code complet J'ai exactement le même problème mais je suis nouveau à ce sujet alors s'il vous plaît exposer. Mon élément n'est pas un textbox mais une combobox. – flexxxit

+0

Pouvez-vous s'il vous plaît poster un exemple de code dans textbox_SelectionChanged? est-ce comme ça? TextBox tb = (TextBox) e.Source; if (tb! = Null) { tb.SelectionStart = 0; } –

0

Lorsqu'un comboxbox obtient le focus, vous pouvez désactiver la surbrillance du texte (c'est-à-dire en ne sélectionnant aucun texte lors de l'événement GotFocus). Cependant, lorsque vous déplacez la liste déroulante, le système va localiser l'élément dans la liste et en faire l'élément sélectionné. Ceci à son tour met automatiquement en évidence le texte. Si je comprends le comportement que vous cherchez, je ne crois pas que ce soit entièrement possible.

+0

vous avez raison? cela ne semble pas possible même si j'utilise la propriété IsTextSearchEnabled à false comme mentionné par asim. – Panks

6

J'ai eu ce même problème et comme certains utilisateurs étaient nouveaux dans WPF, j'ai eu du mal à faire fonctionner la solution donnée par Einar Guðsteinsson. Donc, à l'appui de sa réponse, je colle ici les étapes pour que cela fonctionne. (Ou plus exactement comment j'ai eu ce travail).

Créez d'abord une classe de liste déroulante personnalisée qui hérite de la classe Combobox. Voir le code ci-dessous pour une implémentation complète. Vous pouvez modifier le code dans OnDropSelectionChanged pour répondre à vos besoins individuels.

espace de noms MyCustomComboBoxApp { en utilisant System.Windows.Controls; Vérifiez que cette classe de liste déroulante personnalisée existe dans le même projet.

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

} 
Puis vous pouvez utiliser le code ci-dessous pour référencer ce combo dans votre interface utilisateur.

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

C'est-à-dire! Des questions, s'il vous plaît demander! Je ferai de mon mieux pour aider.

Merci à Einar Guðsteinsson pour sa solution!

3

Je pense que dans la solution fournie par Andrew N, il manque quelque chose car lorsque je l'ai essayé, l'événement Selection Changed du TextBox plaçait le curseur au mauvais endroit. J'ai donc fait ce changement pour résoudre ça.

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

Super endroit et réparer Mohammed! –

2

Suite à la réponse de clsturgeon, j'ai résolu le problème en définissant la sélection lorsque l'événement a eu lieu 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

Cela fonctionne, la solution la plus courte que j'ai trouvé, merci: D – Kreshnik

+0

Maintenant, à voir à propos de faire cela dans un DependencyProperty ... – KornMuffin