2009-09-17 28 views
10

コンボボックスに入力すると、自動的にドロップダウンリストが有効になります。WPF:コンボボックスのドロップダウンでテキストが強調表示されます。

searchComboBox.IsDropDownOpen = true; 

ここで問題となるのは、テキストが強調表示され、次のキーストロークが前のテキストを上書きすることです。

ComboBox DropDownが開いたら、どのようにテキストのハイライト表示を無効にすることができますか?

+0

どの「ComboBoxのドロップダウン」あなたが話していますか? – Trainee4Life

+3

comboBoxのIsTextSearchEnabledプロパティにfalseを設定しましたか?テキストの選択が無効になります。 希望が役立つでしょう。 –

答えて

5

これほど遅くない方がいいでしょう。このプロンプトをヒットした人がいれば、これを使うかもしれません。

コンボボックスをオーバーライドすると、これは遠ざかります。 まず、テンプレートで使用されているテキストボックスのハンドルを取得し、choosechangedイベントに登録します。

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 
} 

イベントハンドラでは、必要に応じて選択を再度設定できます。私の場合は、コードでIsDropDownOpenを呼び出していました。そこに保存された選択がイベントハンドラに戻されます。醜いがトリックをした。

+0

お願い完全に同じ問題を抱えていますが、これで新しいコードを書くことができますか?私の要素はテキストボックスではなく、コンボボックスです。 – flexxxit

+0

サンプルコードをtextbox_SelectionChangedに投稿できますか?それはこれのようなものですか? TextBox tb =(テキストボックス)e.Source; if(tb!= null) { tb.SelectionStart = 0; } –

0

コンボボックスがフォーカスを取得すると、テキストハイライトを無効にすることができます(つまり、GotFocusイベントでテキストを選択しないことによって)。しかし、コンボボックスをプルダウンすると、システムはリスト内の項目を見つけて選択項目にします。これにより自動的にテキストが強調表示されます。あなたが探している行動を理解していれば、それは完全に可能であるとは思わない。

+0

あなたは正しいですか? asimで述べたように、IsTextSearchEnabledプロパティをfalseにしても使用できないようです。 – Panks

6

私はこれと同じ問題を抱えていましたが、WPFを初めて使うユーザーの中には、EinarGuðsteinssonのソリューションを手に入れるのに苦労していました。彼の答えを支持するために、私はここにこれを働かせるためのステップを貼り付けています。 (あるいは私がこれをどのように動作させるかをより正確に)。

まず、Comboboxクラスを継承するカスタムコンボボックスクラスを作成します。完全な実装については、以下のコードを参照してください。個々の要件に合わせてOnDropSelectionChangedのコードを変更することができます。

名前空間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; 
     } 
    } 

} 

このカスタムコンボクラスが同じプロジェクトに存在することを確認してください。あなたはあなたの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> 

それはそれです!ご不明な点は、お問い合わせください!私は助けるために全力を尽くします。

彼のソリューションのためのEinarGuðsteinssonへのTHanks!

3

私はAndrew Nが提供している解決策では、TextBoxのセレクション変更イベントが間違った場所にキャレットを配置していたように見逃していると思います。だから私はそれを解決するためにこの変更を加えました。

clsturgeonの答えにさらに
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

偉大なスポットと修正モハメド! –

2

、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

これは私が見つけた最短の解決策です、ありがとうございます:D – Kreshnik

+0

これをDependencyPropertyにすることについて今見てください... – KornMuffin