我有以下简单程序
<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>
运行时会生成此
按下窗外的按钮。如果我将第二列Auto
和第一列*
与文字太大时正确显示
然而,当文本不是太大时,第二列自动将它放在最右边。
我想要发生的是文本旁边的按钮
最接近我的工作是在文本块上设置最大宽度并将第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="..."/>
这给了我想要的行为,但是我不知道在编译时我将使用它的实际代码中的最大宽度是什么。
我需要做什么才能使按钮跟随文本的宽度,但如果文本对于窗口来说太大,它将用省略号剪切而不设置固定的最大宽度?
答案 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
,但没有一个显示我想要的行为。