2009-09-17 26 views
10

cuando escribo en el desplegable que se abre automáticamente habilita la lista desplegableWPF: desplegable de un cuadro combinado highlightes el texto

searchComboBox.IsDropDownOpen = true; 

El problema aquí es - el texto se resalta y el próximo keystrock sobrescribe el texto anterior.

¿Cómo puedo desactivar el resaltado de texto cuando se abre ComboBox DropDown?

+0

Qué "cuadro combinado desplegable" estás hablando? – Trainee4Life

+3

¿Ha establecido false en la propiedad IsTextSearchEnabled del comboBox? Deshabilitará la selección del texto. espero que ayude. –

Respuesta

5

Es mejor tarde que nunca y si alguien más golpea este proplem podría usarlo.

Hay todo esto a un lado si anula el cuadro combinado. Primero, obtenga el control sobre el cuadro de texto que se utiliza en la plantilla y regístrese para el evento de cambio de selección.

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 
} 

Luego, en el controlador de eventos puede establecer la selección nuevamente como desee. En mi caso, estaba llamando a IsDropDownOpen en el código. Se guardó la selección allí y luego se volvió a colocar en el controlador de eventos. Feo pero hizo el truco.

+0

Por favor, ¿Puedes escribir el código completo? Tengo exactamente el mismo problema, pero soy nuevo en esto, así que por favor expone. Mi elemento no es un cuadro de texto sino un cuadro combinado. – flexxxit

+0

¿Puedes publicar un código de muestra en textbox_SelectionChanged? ¿es así? TextBox tb = (TextBox) e.Source; if (tb! = Null) { tb.SelectionStart = 0; } –

0

Cuando un comboxbox gana foco, puede deshabilitar el resaltado de texto (es decir, al seleccionar ningún texto en el evento GotFocus). Sin embargo, al desplegar el cuadro combinado, el sistema ubicará el elemento en la lista y lo convertirá en el elemento seleccionado. Esto a su vez resalta automáticamente el texto. Si entiendo el comportamiento que estás buscando, no creo que sea completamente posible.

+0

tiene usted razón? parece que no es posible incluso si uso la propiedad IsTextSearchEnabled en falso como se menciona en asim. – Panks

6

Tuve el mismo problema y, como algunos de los usuarios que son nuevos en WPF, tuvieron problemas para conseguir que la solución ofrecida por Einar Guðsteinsson funcionara. Entonces, en apoyo de su respuesta, estoy pegando aquí los pasos para que esto funcione. (O más exactamente cómo conseguí que esto funcione).

Primero cree una clase de combobox personalizada que hereda de la clase Combobox. Vea el código a continuación para la implementación completa. Puede cambiar el código en OnDropSelectionChanged para satisfacer sus necesidades individuales.

espacio de nombres MyCustomComboBoxApp { usando 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; 
     } 
    } 

} 

Asegúrese de que esta clase de combo personalizada exista en el mismo proyecto. Entonces puede usar el código a continuación para hacer referencia a este combo en su UI.

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

Thats it! Cualquier pregunta, por favor pregunta! Haré todo lo posible para ayudar.

¡Gracias a Einar Guðsteinsson por su solución!

3

Creo que en la Solución provista por Andrew N falta algo, ya que cuando lo probé, el evento Selección Cambiada del TextBox estaba colocando el símbolo de intercalación en el lugar equivocado. Así que hice este cambio para resolver eso.

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

¡Excelente lugar y soluciona Mohammed! –

2

con la respuesta de clsturgeon, he resuelto el problema estableciendo la selección cuando se produjo 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

Funciona, la solución más corta que he encontrado, gracias: D – Kreshnik

+0

Ahora para ver cómo convertir esto en una DependencyProperty ... – KornMuffin

Cuestiones relacionadas