Viewbox中的WPF TextBlock溢出

时间:2014-12-23 13:26:26

标签: c# wpf xaml

我希望在带有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不正确!?

2 个答案:

答案 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",但在这种情况下,它不会修剪您的文字。

但我不认为这不是最好的方法,你一定是误解了视图框的目标。