如何修剪ComboBox中显示的文本?

时间:2017-06-27 11:13:28

标签: c# wpf combobox

我有自己的组合框(autocompleteCombobox),我希望只看到selectedItem的35个字符,但是显示全名的工具提示。

用户控制代码:

has()

在autocompletecombobox的cs文件中:

var hasItem = simpleCart.has(item);
var existItem = hasItem === false ? 0 : hasItem.get('weight');

但它不起作用......

4 个答案:

答案 0 :(得分:2)

而不是将文本修剪为一定数量的字符,您可以让WPF根据文本的视觉宽度为您修剪它,这可能看起来更好。如果这是您的选择,您可以查看TextBlock.TextTrimming - 属性。

答案 1 :(得分: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>

答案 2 :(得分:1)

依赖项属性的CLR包装器的setter应始终调用SetValue方法来设置依赖项属性的值。别的什么:

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

此外,您希望保留原始值,以便能够在工具提示中显示它。

使用@Alematt建议的转换器似乎是一个不错的选择。只需稍微修改ItemTemplate

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

创建一个转换器类:

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

答案 3 :(得分:1)

而不是将SelectedItem传递给你的转换器,如下所示:

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();
    }
}  

然后使用您的转换器:

<locals:MultiValConverter x:Key="multi"/>

你会像这样引用转换器:

$guarded