2009-09-17 40 views
10

Khi tôi gõ vào combobox tôi sẽ tự động mở cho phép trong danh sách thả xuốngWPF: Thả xuống của một Combobox highlightes văn bản

searchComboBox.IsDropDownOpen = true; 

Vấn đề ở đây là - văn bản được tô đậm và keystrock tiếp theo ghi đè các văn bản trước đây.

Làm cách nào để tắt tính năng đánh dấu văn bản khi ComboBox DropDown mở ra?

+0

nào "ComboBox thả xuống" bạn đang nói về? – Trainee4Life

+3

Bạn có đặt false thành thuộc tính IsTextSearchEnabled của comboBox không ?? Nó sẽ vô hiệu hóa lựa chọn văn bản. hy vọng điều đó sẽ hữu ích. –

Trả lời

5

Tốt hơn nhiều so với không bao giờ và nếu một số người khác nhấn vào chương trình này, anh ấy có thể sử dụng điều này.

Có thể làm điều này nếu bạn ghi đè combobox. Đầu tiên có được xử lý trên hộp văn bản được sử dụng trong mẫu và đăng ký sự kiện 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 
} 

Sau đó, trong trình xử lý sự kiện, bạn có thể đặt lại lựa chọn như bạn muốn. Trong trường hợp của tôi, tôi đã gọi IsDropDownOpen trong mã. Lựa chọn đã lưu ở đó sau đó đặt nó trở lại trong trình xử lý sự kiện. Ugly nhưng đã làm các trick.

+0

Xin bạn có thể viết mã hoàn chỉnh Tôi có cùng một vấn đề chính xác nhưng mới ở đây vì vậy xin vui lòng expound. Phần tử của tôi không phải là một hộp văn bản mà là một combobox. – flexxxit

+0

Bạn có thể vui lòng đăng một mã mẫu trong textbox_SelectionThay đổi không? là nó như thế này? TextBox tb = (TextBox) e.Source; nếu (tb! = Null) { tb.SelectionStart = 0; } –

0

Khi hộp thư đạt được tiêu điểm, bạn có thể tắt đánh dấu văn bản (tức là không chọn văn bản khi sự kiện GotFocus). Tuy nhiên, khi bạn kéo xuống hộp tổ hợp, hệ thống sẽ định vị mục trong danh sách và làm cho mục đó được chọn. Điều này lần lượt tự động làm nổi bật văn bản. Nếu tôi hiểu hành vi mà bạn đang tìm kiếm, tôi không tin nó là hoàn toàn có thể.

+0

bạn đúng không? có vẻ như không thể ngay cả khi tôi sử dụng thuộc tính IsTextSearchEnabled thành false như được đề cập bởi asim. – Panks

6

Tôi đã có vấn đề này rất giống nhau và giống như một số người dùng mới làm quen với WPF, đấu tranh để có được giải pháp được đưa ra bởi Einar Guðsteinsson để làm việc. Vì vậy, để hỗ trợ cho câu trả lời của mình, tôi đang dán các bước này để làm việc này. (Hay chính xác hơn cách tôi làm việc này).

Trước tiên, hãy tạo lớp combobox tùy chỉnh kế thừa từ lớp Combobox. Xem mã bên dưới để thực hiện đầy đủ. Bạn có thể thay đổi mã trong OnDropSelectionChanged để phù hợp với yêu cầu cá nhân của bạn.

không gian tên 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; 
     } 
    } 

} 

Đảm bảo rằng lớp kết hợp tùy chỉnh này tồn tại trong cùng một dự án. Bạn có thể sử dụng mã bên dưới để tham chiếu kết hợp này trong giao diện người dùng của mình.

<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! Mọi thắc mắc, xin hỏi! Tôi sẽ cố hết sức để giúp đỡ.

Cảm ơn Einar Guðsteinsson về giải pháp của anh ấy!

3

Tôi nghĩ rằng trong Giải pháp được cung cấp bởi Andrew N có một cái gì đó bị thiếu như khi tôi đã thử nó ra sự kiện Selection Changed của TextBox đã đặt dấu mũ ở vị trí sai. Vì vậy, tôi đã thực hiện thay đổi này để giải quyết điều đó.

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

Great spot and fix Mohammed! –

2

Tiếp tục câu trả lời clsturgeon, tôi đã giải quyết vấn đề bằng cách thiết lập các lựa chọn khi DropDownOpened sự kiện đã xảy ra:

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

Nó hoạt động, giải pháp ngắn nhất tôi đã tìm thấy, cảm ơn bạn: D – Kreshnik

+0

Bây giờ để xem về làm cho điều này thành một DependencyProperty ... – KornMuffin

Các vấn đề liên quan