我有自己的组合框(autocompleteCombobox),我希望只看到selectedItem的35个字符,但是显示全名的工具提示。
用户控制代码:
has()
在autocompletecombobox的cs文件中:
var hasItem = simpleCart.has(item);
var existItem = hasItem === false ? 0 : hasItem.get('weight');
但它不起作用......
答案 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