2017-06-27 31 views
0

私は自分のコンボボックス(autocompleteCombobox)を持っています。ここでは、selectedItemの35文字しか表示されませんが、フルネームを示すツールチップが表示されます。ComboBoxに表示されるテキストをトリミングする方法は?

ユーザーコントロールコード:

そしてautocompletecomboboxのCSファイル内

<UserControl.Resources> 
    <Style x:Key="ComboboxStyle" TargetType="{x:Type ComboBox}"> 
     <Setter Property="ItemTemplate"> 
      <Setter.Value> 
       <DataTemplate> 
        <TextBlock Text="{Binding ShownName}"/> 
       </DataTemplate> 
      </Setter.Value> 
     </Setter> 
    </Style> 
</UserControl.Resources> 
<Grid> 
    <ComboBox x:Name="Combobox" IsSynchronizedWithCurrentItem="True" 
       IsEditable="True" TextSearch.Text="ShownName" 
       IsTextSearchEnabled="True" DisplayMemberPath="ShownName" 
       ToolTip="{Binding SelectedItem.ShownName,ElementName=autoComplete}" 
       ItemsSource="{Binding ItemsSource,ElementName=autoComplete}" 
       SelectedItem="{Binding SelectedItem, ElementName=autoComplete}" 
       Style="{StaticResource ComboboxStyle}"> 
     <ComboBox.InputBindings> 
      <KeyBinding Key="Enter" 
         Command="{Binding Path=SelectItemCommand, ElementName=autoComplete}" 
         CommandParameter="ShownName"/> 
     </ComboBox.InputBindings> 
    </ComboBox> 
</Grid> 

public static readonly DependencyProperty MaxTextLengthProperty = 
     DependencyProperty.Register(
      "MaxTextLength", 
      typeof(int), 
      typeof(ComboBoxAutoComplete), 
      new UIPropertyMetadata(35)); 
     public int MaxTextLength 
     { 
      get { return (int)GetValue(MaxTextLengthProperty); } 
      set 
      { 
       SetValue(MaxTextLengthProperty, value); 
       LimitTextInCombobox(); 
      } 
     } 

     private void LimitTextInCombobox() 
     { 
      Combobox.Text = Combobox.Text.Substring(0, MaxTextLength); 
     }  

しかし、それは動作しません...

+0

何をテキスト? – GeorgeChond

+0

どのように動作するか教えてもらえますか? – Krom

+0

私は試していますが、テキストを変換するとツールチップが制限されてしまいます... – Krom

答えて

2

むしろテキストを特定の文字数にトリミングするよりも、WPFで再トリミングすることができますスペクトラムをテキストの視覚的な幅に変換します。これがオプションの場合は、TextBlock.TextTrimmingのプロパティを調べることができます。

+1

@Kromで始まっているすべてのアイテムが検索されます。アイテムテンプレートを持つItemTemplateを与えることができます。 –

+1

@Kromあなた自身のテンプレートを使用しても、それには何の効果もありません。あなたがテンプレートを書くのに助けが必要な場合、私はあなたにどのようにあなたを示すことができます –

+0

それは役に立つかもしれませんが、テキストブロックにtextTrimmingを入れると、すべてのアイテムがトリミングされ、コンボボックスに表示されているアイテムをトリミングしたいだけです。リストがドロップダウンである場合、アイテムは通常の長さでなければなりません – Krom

1

あなたはコンバータ

[ValueConversion(typeof(object), typeof(string))] 
public class StringFormatConverter : IValueConverter 
{ 
    public object Convert(object value, Type targetType, 
          object parameter, CultureInfo culture) 
    { 
     string str = value.ToString(); 
     if (string.IsNullOrEmpty(str)) 
     { 
      return ""; 
     } 
     else 
     { 
      if (str.Length >= 35) 
      { 
       return str.Substring(0, 35); 
      } 
      else 
      { 
       return str; 
      } 

     } 

    } 


    public object ConvertBack(object value, Type targetType, 
           object parameter, CultureInfo culture) 
    { 
     throw new NotSupportedException(); 
    } 
} 

を使用することができますし、XAML

<Windows.Resources> 
    <dict:StringFormatConverter x:Key="StringFormatConverter"/> 
</Windows.Resources> 

<UserControl.Resources> 
<Style x:Key="ComboboxStyle" TargetType="{x:Type ComboBox}"> 
    <Setter Property="ItemTemplate"> 
     <Setter.Value> 
      <DataTemplate> 
       <TextBlock Text="{Binding ShowName, Converter={StaticResource StringFormatConverter}}"/> 
      </DataTemplate> 
     </Setter.Value> 
    </Setter> 
</Style> 

+0

しかし、このソリューションでは、すべてのアイテムがトリムされます...私は表示されたいだけですが、ツールチップにフルネームを表示する必要があります – Krom

1

で依存関係プロパティのCLRラッパーのセッターは常にのみ設定するSetValueメソッドを呼び出す必要があります依存関係プロパティの値他には何も:

public int MaxTextLength 
{ 
    get { return (int)GetValue(MaxTextLengthProperty); } 
    set 
    { 
     SetValue(MaxTextLengthProperty, value); 
    } 
} 

はまた、あなたはとにかくツールチップで表示できるように元の値を保持したいん。

@Alemattが提案したようにコンバータを使うのは良い選択です。

​​

を、コンバータクラスを作成します:ちょうど少しItemTemplateを変更

public class Converter : IValueConverter 
{ 
    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
    { 
     string shownName = value as string; 
     if (!string.IsNullOrEmpty(shownName) && shownName.Length > 35) 
      return shownName.Substring(0, 35) + "..."; 

     return value; 

    } 

    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
    { 
     throw new NotSupportedException(); 
    } 
} 

、そのままTooltipを保つ:その代わりの

ToolTip="{Binding SelectedItem.ShownName, ElementName=autoComplete}" 
+0

あなたのソリューションを試してみましたが、コンボボックス(選択した項目)の値をトリムするようにします – Krom

+0

次に、IsEditableプロパティをfalseに設定する必要があります。 – mm8

+0

私は同じ結論に達しました...私は実際には、テキスト検索オプションと有効なオプションでそれを行う方法が見つかりませんでした... – Krom

1

ちょうどあなたへのSelectedItemを渡しますコンバータはそうです:

 <ComboBox x:Name="cmb"> 
     <ComboBox.Style> 
      <Style TargetType="ComboBox"> 
       <Setter Property="ItemTemplate"> 
        <Setter.Value> 
         <DataTemplate> 
          <TextBlock> 
           <TextBlock.Text> 
            <MultiBinding Converter="{StaticResource multi}"> 
             <Binding Path="."/> 
             <Binding Path="SelectedItem" ElementName="cmb"/> 
            </MultiBinding> 
           </TextBlock.Text> 
          </TextBlock> 
       </DataTemplate> 
      </Setter.Value> 
     </Setter> 
    </Style> 
     </ComboBox.Style> 
     <ComboBox.Items> 
      <sys:String>Very long string 1</sys:String> 
      <sys:String>Very long string 2</sys:String> 
     </ComboBox.Items> 
    </ComboBox> 

そして、そのようなあなたのコンバータを使用します。

class MultiValConverter : IMultiValueConverter 
{ 
    public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture) 
    { 
     if (values[0] != null && values[1] != null) 
     { 
      if (values[0].ToString() == values[1].ToString()) 
      { 
       return "...";//put your logic here i.e. substring(0,30); 
      } 
     } 
     return values[0]; 
    } 

    public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture) 
    { 
     throw new NotImplementedException(); 
    } 
} 

、あなたはこのようなコンバータ参照します:制限する代わりに新しい `DependecyProperty`の新しい` IValueConverter`の作成について

<locals:MultiValConverter x:Key="multi"/> 
関連する問題