获取省略号以显示自动宽度文本

时间:2014-12-02 16:25:24

标签: c# wpf

我有以下简单程序

<Window x:Class="TextCutoffExample.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="100" Width="200">
    <Grid>
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="Auto"/>
            <ColumnDefinition Width="*"/>
        </Grid.ColumnDefinitions>

        <TextBlock Grid.Column="0" Text="aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" TextTrimming="CharacterEllipsis"/>
        <Button Grid.Column="1" HorizontalAlignment="Left" VerticalAlignment="Top" Content="..."/>
    </Grid>
</Window>

运行时会生成此

enter image description here

按下窗外的按钮。如果我将第二列Auto和第一列*与文字太大时正确显示

enter image description here

然而,当文本不是太大时,第二列自动将它放在最右边。

enter image description here

我想要发生的是文本旁边的按钮

enter image description here

最接近我的工作是在文本块上设置最大宽度并将第1列设置为自动

    <Grid.ColumnDefinitions>
        <ColumnDefinition Width="Auto"/>
        <ColumnDefinition Width="*"/>
    </Grid.ColumnDefinitions>

    <TextBlock Grid.Column="0" Text="aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" TextTrimming="CharacterEllipsis" 
               MaxWidth="180"/>
    <Button Grid.Column="1" HorizontalAlignment="Left" VerticalAlignment="Top" Content="..."/>

这给了我想要的行为,但是我不知道在编译时我将使用它的实际代码中的最大宽度是什么。

我需要做什么才能使按钮跟随文本的宽度,但如果文本对于窗口来说太大,它将用省略号剪切而不设置固定的最大宽度?

2 个答案:

答案 0 :(得分:1)

如果在我从现有代码中删除此内容之前,我已经看过你的不那么优雅的评论,我就不会付出努力

<Window x:Class="WidthConverter.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
         xmlns:local="clr-namespace:WidthConverter"
        Title="MainWindow" Height="350" Width="525">
    <Window.Resources>
        <local:WidthConverterParam x:Key="widthConverter"/>
    </Window.Resources>
    <Grid x:Name="MainGrid">
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="Auto"/>
            <ColumnDefinition Width="Auto"/>
            <ColumnDefinition Width="Auto"/>
            <ColumnDefinition Width="*"/>
        </Grid.ColumnDefinitions>
        <TextBlock Grid.Column="0" Text="{Binding ElementName=MainGrid, Path=ActualWidth}" Margin="10,0,0,0"/>
        <TextBlock Grid.Column="1" Text="{Binding ElementName=MainGrid, Path=ActualWidth, Converter={StaticResource widthConverter}, ConverterParameter=80}" Margin="10,0,10,0"/>
        <TextBlock Grid.Column="2" Text="aaaaaaaaaaaaaaaaaaaaaaaaaaaabcdefghijklmnop" TextTrimming="CharacterEllipsis" 
               MaxWidth="{Binding ElementName=MainGrid, Path=ActualWidth, Converter={StaticResource widthConverter}, ConverterParameter=80}"/>
        <Button Grid.Column="3" HorizontalAlignment="Left" VerticalAlignment="Top" Content="..."/>
    </Grid>
</Window>

using System.Globalization;

namespace WidthConverter
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
        }
    }

    [ValueConversion(typeof(double), typeof(double))]
    public class WidthConverterParam : IValueConverter
    {
        public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
        {
            // value is the total width available

            double otherWidth;
            try
            {
                otherWidth = System.Convert.ToDouble(parameter);
            }
            catch
            {
                otherWidth = 100;
            }
            if (otherWidth < 0) otherWidth = 0;

            double width = (double)value - otherWidth;
            if (width < 0) width = 0;
            return width; // columnsCount;
        }

        public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
        {
            throw new NotImplementedException();
        }
    }
}

答案 1 :(得分:0)

我的一位同事找到了一个简单的解决方法,如果你将网格包裹在TextBlock中,它会使其表现完全符合我的想法。

<Window x:Class="TextCutoffExample.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="100" Width="200">
    <Grid>
        <TextBlock>
            <Grid>
                <Grid.ColumnDefinitions>
                    <ColumnDefinition />
                    <ColumnDefinition Width="Auto" />
                </Grid.ColumnDefinitions>
                <TextBlock Grid.Column="0" Text="aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"  TextWrapping="NoWrap" TextTrimming="CharacterEllipsis"/>
                <Button Grid.Column="1" HorizontalAlignment="Left" VerticalAlignment="Top" Width="15"  Content="..."/>
            </Grid>
        </TextBlock>
    </Grid>
</Window>

我尝试了其他“基础”UI组件,例如ContentPresenter,但没有一个显示我想要的行为。