我希望在带有TextTrimming的ViewboxPanel控件中有一个TextBlock,但为了做到这一点,TextBlock必须有一个宽度。但是,在ViewboxPanel中,宽度与显示的宽度无关?
<Window x:Class="SizeTest.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:converters="clr-namespace:SizeTest.Utils.Converters;assembly=SizeTest.Utils"
xmlns:controls="clr-namespace:SizeTest.Utils.Controls;assembly=SizeTest.Utils"
Title="MainWindow" Height="350" Width="525">
<Window.Resources>
<ResourceDictionary>
<converters:MarginConverter x:Key="MarginConverter"/>
</ResourceDictionary>
</Window.Resources>
<Grid>
<controls:ViewboxPanel HorizontalAlignment="Left">
<controls:ViewboxPanel.Margin>
<MultiBinding Converter="{StaticResource MarginConverter}" ConverterParameter="0;40;0;40">
<Binding RelativeSource="{RelativeSource Mode=FindAncestor, AncestorType={x:Type Grid}}" Path="ActualHeight" />
<Binding RelativeSource="{RelativeSource Mode=FindAncestor, AncestorType={x:Type Grid}}" Path="ActualWidth" />
</MultiBinding>
</controls:ViewboxPanel.Margin>
<TextBlock Text="fgghgfhdfgfgsdfdsfdsfdsfsdf" Width="130" TextTrimming="CharacterEllipsis" />
</controls:ViewboxPanel>
</Grid>
</Window>
控制:
public class ViewboxPanel : Panel
{
private double scale;
protected override Size MeasureOverride(Size availableSize)
{
double height = 0;
Size unlimitedSize = new Size(double.PositiveInfinity, double.PositiveInfinity);
foreach (UIElement child in Children)
{
child.Measure(unlimitedSize);
height += child.DesiredSize.Height;
}
scale = availableSize.Height / height;
return availableSize;
}
protected override Size ArrangeOverride(Size finalSize)
{
Transform scaleTransform = new ScaleTransform(scale, scale);
double height = 0;
foreach (UIElement child in Children)
{
child.RenderTransform = scaleTransform;
child.Arrange(new Rect(new Point(0, scale * height), new Size(finalSize.Width / scale, child.DesiredSize.Height)));
height += child.DesiredSize.Height;
}
return finalSize;
}
}
ViewboxPanel由保证金和百分比控制。但是为什么TextBlock的130的宽度与ViewboxPanel的宽度(525)(窗口宽度)相匹配?
我希望能够调整窗口大小,文本块的宽度应该跟随,以便通过修剪来显示/隐藏文本。所以textblock的宽度应该绑定到它所在的网格宽度,如下所示:
Width="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type Grid}}, Path=ActualWidth}"
但我不明白为什么525不正确!?
答案 0 :(得分:1)
你似乎误解了ViewBox
control的目的。从MSDN上的链接页面:
定义内容装饰器,可以拉伸和缩放单个子以填充可用空间。
为了获得改变角色省略号开始点所需的效果,您需要更改Width
的{{1}},而不是TextBlock
。
答案 1 :(得分:0)
在您的情况下,视图框会尝试缩放其中的子项,因此,如果将文本块的宽度设置为83,则视图框保留控件的比例,根据父项的实际宽度和高度对其进行缩放容器。它永远不会截断你的文本块,因为它会缩放它以保持文本块的比例,因此如果窗口没有足够的空间来显示文本块的内容,则视图框会将其缩小,反之亦然
我认为如果你想使用视图修剪文本块的内容,你应该尝试将texblock的宽度绑定到窗口的宽度
<Window x:Class="SizeTest.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="350" Width="525" Name="WinName">
<Grid>
<Viewbox Height="100" HorizontalAlignment="Left">
<TextBlock Text="fgghgfhdfgfgdsfdsf" Width="{Binding Path=ActualWidth, ElementName=WinName}" TextTrimming="CharacterEllipsis" />
</Viewbox>
</Grid>
但在这种情况下,视图框不会对您的文本块进行任何更改:它不会缩放。
如果它可以满足,您可以尝试设置Stretch="UniformToFill"
,但在这种情况下,它不会修剪您的文字。
但我不认为这不是最好的方法,你一定是误解了视图框的目标。