2009-09-17 16 views
10

Po wpisaniu w combobox I automatycznie otwiera umożliwia lista rozwijanaWPF: rozwijanej combobox highlightes tekst

searchComboBox.IsDropDownOpen = true; 

Problemem tutaj jest - tekst zostanie podświetlony, a obok keystrock nadpisuje poprzedni tekst.

Jak mogę wyłączyć podświetlanie tekstu, gdy otwiera się ComboBox DropDown?

+0

Który „ComboBox DropDown” ty mówisz? – Trainee4Life

+3

Czy ustawiłeś wartość false na właściwość IsTextSearchEnabled w comboBox? Wyłącza wybór tekstu. nadzieję, że to pomoże. –

Odpowiedz

5

Lepiej późno niż wcale i jeśli ktoś inny uderzy w ten motłoch, może go użyć.

Jest od tego do góry, jeśli zastąpisz combobox. Najpierw pobierz uchwyt pola tekstowego, który jest używany w szablonie, i zarejestruj się w zdarzeniu wyboru.

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 
} 

Następnie w programie obsługi zdarzeń można ponownie ustawić wybór tak, jak chcesz. W moim przypadku wywoływałam IsDropDownOpen w kodzie. Zapisano tam zaznaczenie, a następnie wstawiono z powrotem do programu obsługi zdarzeń. Brzydki, ale załatwił sprawę.

+0

Proszę, możesz napisać pełny kod Mam ten sam problem, ale jestem nowy w tym, więc proszę wyjaśnić. Mój element nie jest polem tekstowym, ale comboboxem. – flexxxit

+0

Czy możesz wysłać przykładowy kod do textbox_SelectionChanged? czy to jest tak? TextBox tb = (TextBox) e.Source; if (tb! = Null) { tb.SelectionStart = 0; } –

0

Gdy pole comboxbox zyskuje ostrość, możesz wyłączyć podświetlanie tekstu (tj. Nie wybierając tekstu po zdarzeniu GotFocus). Jednak podczas rozwijania combobox system lokalizuje element na liście i wybiera wybrany element. To z kolei automatycznie podświetla tekst. Jeśli rozumiem zachowanie, którego szukasz, nie wierzę, że jest to w pełni możliwe.

+0

masz rację? wydaje się to niemożliwe, nawet jeśli użyję właściwości IsTextSearchEnabled na false, jak wspomina asim. – Panks

6

Miałem ten sam problem i jak niektórzy użytkownicy są nowi w WPF, walczył, aby uzyskać rozwiązanie podane przez Einar Guðsteinsson do pracy. Więc popieram jego odpowiedź, wklejając tutaj kroki, aby to zadziałało. (A dokładniej, jak mam to do roboty).

Najpierw utwórz niestandardową klasę combobox, która dziedziczy po klasie Combobox. Zobacz pełny kod poniżej. Możesz zmienić kod w OnDropSelectionChanged, aby dostosować go do indywidualnych wymagań.

namespace MyCustomComboBoxApp { przy użyciu 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; 
     } 
    } 

} 

Upewnij się, że ta niestandardowa klasa kombi istnieje w tym samym projekcie. Możesz użyć poniższego kodu, aby odwołać się do tej kombinacji w twoim interfejsie.

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

To wszystko! Wszelkie pytania, zadaj pytanie! Zrobię co w mojej mocy, aby pomóc.

Dziękuję Einarowi Guðsteinssonowi za jego rozwiązanie!

3

Myślę, że w Rozwiązaniu dostarczonym przez Andrew N czegoś brakuje, ponieważ kiedy wypróbowałem to wydarzenie Selection Changed TextBox umieszczało karetkę w niewłaściwym miejscu. Więc dokonałem tej zmiany, aby to rozwiązać.

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

Wspaniałe miejsce i poprawienie Mohammeda! –

2

nawiązaniu do odpowiedzi clsturgeon za, mam rozwiązany problem przez ustawienie zaznaczenia, gdy nastąpiło zdarzenie 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

To działa, najkrótsze rozwiązanie, które znalazłem, dziękuję: D – Kreshnik

+0

Teraz zobacz, jak zrobić to w DependencyProperty ... – KornMuffin