有没有办法将TextBlock上的文本修剪指定为从左侧开始?
我已经成功完成了三个场景中的两个(第三个是我需要的场景):
// Result:"A very long te...“
// Result:"...A very long te“
//期望结果:"...uires trimming"
有没有人知道这是否可能?谢谢。
发布于 2012-01-19 22:20:30
你不能开箱即用,但我能想到两件事:
1)为TextBlock创建一个类似LeftTrimmingText的附加属性。然后,您将设置此属性,而不是Text属性。例如。
<TextBlock my:TextBlockHelper.LeftTrimmingText="A very long text that requires trimming." />attached属性将计算实际可以显示的字符数,然后相应地设置TextBlock的Text属性。
2)创建您自己的类来包装TextBlock,并添加您自己的属性来处理所需的逻辑。
我认为第一个选择更简单。
发布于 2012-01-23 08:09:50
如果您不关心省略号,但只想看到文本的结尾,而不是它被截断时的开头,那么可以将TextBlock包装在另一个容器中,并将其HorizontalAlignment设置为Right。这将像你想要的那样切断它,但是没有省略。
<Grid>
<TextBlock Text="Really long text to cutoff." HorizontalAlignment="Right"/>
</Grid>发布于 2015-06-09 19:45:51
这种风格可以完成这项工作。诀窍是为标签重新定义一个控件模板。然后将内容放入剪切画布中,并与画布的右侧对齐。内容的最小宽度是画布的宽度,因此如果有足够的空间,则内容文本将左对齐,剪切时将右对齐。
如果内容的宽度大于画布,则触发椭圆打开。
<Style x:Key="LeftEllipsesLabelStyle"
TargetType="{x:Type Label}">
<Setter Property="Foreground"
Value="{DynamicResource {x:Static SystemColors.ControlTextBrushKey}}" />
<Setter Property="Background"
Value="Transparent" />
<Setter Property="Padding"
Value="5" />
<Setter Property="HorizontalContentAlignment"
Value="Left" />
<Setter Property="VerticalContentAlignment"
Value="Top" />
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type Label}">
<Grid >
<Grid.Resources>
<LinearGradientBrush x:Key="HeaderBackgroundOpacityMask" StartPoint="0,0" EndPoint="1,0">
<GradientStop Color="Black" Offset="0"/>
<GradientStop Color="Black" Offset="0.5"/>
<GradientStop Color="Transparent" Offset="1"/>
</LinearGradientBrush>
</Grid.Resources>
<Canvas x:Name="Canvas"
ClipToBounds="True"
DockPanel.Dock="Top"
Height="{Binding ElementName=Content, Path=ActualHeight}">
<Border
BorderBrush="{TemplateBinding BorderBrush}"
Canvas.Right="0"
Canvas.ZIndex="0"
BorderThickness="{TemplateBinding BorderThickness}"
Background="{TemplateBinding Background}"
Padding="{TemplateBinding Padding}"
MinWidth="{Binding ElementName=Canvas, Path=ActualWidth}"
SnapsToDevicePixels="true"
x:Name="Content"
>
<ContentPresenter
HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}"
Content="{Binding RelativeSource={RelativeSource AncestorType=Label}, Path=Content}"
RecognizesAccessKey="True"
SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}"
VerticalAlignment="{TemplateBinding VerticalContentAlignment}"
>
<ContentPresenter.Resources>
<Style TargetType="TextBlock">
<Setter Property="FontSize" Value="{Binding FontSize, RelativeSource={RelativeSource AncestorType={x:Type Label}}}"/>
<Setter Property="FontWeight" Value="{Binding FontWeight, RelativeSource={RelativeSource AncestorType={x:Type Label}}}"/>
<Setter Property="FontStyle" Value="{Binding FontStyle, RelativeSource={RelativeSource AncestorType={x:Type Label}}}"/>
<Setter Property="FontFamily" Value="{Binding FontFamily, RelativeSource={RelativeSource AncestorType={x:Type Label}}}"/>
</Style>
</ContentPresenter.Resources>
</ContentPresenter>
</Border>
<Label
x:Name="Ellipses"
Canvas.Left="0"
Canvas.ZIndex="10"
FontWeight="{TemplateBinding FontWeight}"
FontSize="{TemplateBinding FontSize}"
FontFamily="{TemplateBinding FontFamily}"
FontStyle="{TemplateBinding FontStyle}"
VerticalContentAlignment="Center"
OpacityMask="{StaticResource HeaderBackgroundOpacityMask}"
Background="{TemplateBinding Background}"
Foreground="RoyalBlue"
Height="{Binding ElementName=Content, Path=ActualHeight}"
Content="...   ">
<Label.Resources>
<Style TargetType="Label">
<Style.Triggers>
<DataTrigger Value="true">
<DataTrigger.Binding>
<MultiBinding Converter="{StaticResource GteConverter}">
<Binding ElementName="Canvas" Path="ActualWidth"/>
<Binding ElementName="Content" Path="ActualWidth"/>
</MultiBinding>
</DataTrigger.Binding>
<Setter Property="Visibility" Value="Hidden"/>
</DataTrigger>
</Style.Triggers>
</Style>
</Label.Resources>
</Label>
</Canvas>
</Grid>
<ControlTemplate.Triggers>
<Trigger Property="IsEnabled"
Value="false">
<Setter Property="Foreground"
Value="{DynamicResource {x:Static SystemColors.GrayTextBrushKey}}" />
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>这里有几个实用程序类
GteConverter
<c:GteConverter x:Key="GteConverter"/>这就是
public class RelationalValueConverter : IMultiValueConverter
{
public enum RelationsEnum
{
Gt,Lt,Gte,Lte,Eq,Neq
}
public RelationsEnum Relations { get; protected set; }
public RelationalValueConverter(RelationsEnum relations)
{
Relations = relations;
}
public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
{
if(values.Length!=2)
throw new ArgumentException(@"Must have two parameters", "values");
var v0 = values[0] as IComparable;
var v1 = values[1] as IComparable;
if(v0==null || v1==null)
throw new ArgumentException(@"Must arguments must be IComparible", "values");
var r = v0.CompareTo(v1);
switch (Relations)
{
case RelationsEnum.Gt:
return r > 0;
break;
case RelationsEnum.Lt:
return r < 0;
break;
case RelationsEnum.Gte:
return r >= 0;
break;
case RelationsEnum.Lte:
return r <= 0;
break;
case RelationsEnum.Eq:
return r == 0;
break;
case RelationsEnum.Neq:
return r != 0;
break;
default:
throw new ArgumentOutOfRangeException();
}
}
public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture)
{
throw new NotImplementedException();
}
}和
public class GtConverter : RelationalValueConverter
{
public GtConverter() : base(RelationsEnum.Gt) { }
}
public class GteConverter : RelationalValueConverter
{
public GteConverter() : base(RelationsEnum.Gte) { }
}
public class LtConverter : RelationalValueConverter
{
public LtConverter() : base(RelationsEnum.Lt) { }
}
public class LteConverter : RelationalValueConverter
{
public LteConverter() : base(RelationsEnum.Lte) { }
}
public class EqConverter : RelationalValueConverter
{
public EqConverter() : base(RelationsEnum.Eq) { }
}
public class NeqConverter : RelationalValueConverter
{
public NeqConverter() : base(RelationsEnum.Neq) { }
}这是它的工作原理。



https://stackoverflow.com/questions/8927501
复制相似问题