对于单个项目,我看到的建议是对前者使用TextBlock
,将TextWrapping="true"
用于前者,对后者使用Viewbox
。然而,这两者并不能很好地结合在一起。我见过的将两者合并的唯一方法是在TextBlock][1]
上明确设置一个[Width
,但这需要知道高级文本的宽度,因为不同长度的文本只能很好地处理不同宽度而不适合使用与模板化,因为理想的长度将是可变的,事先不知道。如何在WPF ItemTemplate中结合自动换行和动态字体大小
没有设置明确的宽度是我得到的是:
其中一期工程为两个单词项OK,但多字,如果包裹在多线中的一条将填补该地区更好。
设置Width="80"
在TextBlock
上获得多词文本很好地包装;但拧紧单个单词项目的布局。
我想要的东西,它可以扩展一个字元素,以适应(如顶部图像中的前两个按钮),并在扩展到更好地利用可用空间的包装多字的项目(类似于第二个例子中的第三个按钮 - 尽管如果3个或更多的工作更好,则不需要将其限制为仅两行文本)。
我用上面的例子XAML是:
<Window x:Class="WpfApplication1.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:WpfApplication1"
mc:Ignorable="d"
Title="MainWindow" Height="150" Width="525">
<Window.Resources>
<local:MYViewModel x:Key="myVM"/>
</Window.Resources>
<Grid DataContext="{Binding Source={StaticResource myVM}}">
<ItemsControl ItemsSource="{Binding ThingsList, Mode= OneWay}"
HorizontalAlignment="Stretch" >
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<UniformGrid Columns="3" Rows="1"
HorizontalAlignment="Stretch" />
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
<ItemsControl.ItemTemplate>
<DataTemplate>
<Button>
<Viewbox>
<TextBlock TextWrapping="Wrap" Text="{Binding Name}" />
</Viewbox>
</Button>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
</Grid>
</Window>
和它背后:
public class NamedThing
{
public string Name { get; set; }
}
public class MYViewModel
{
public ObservableCollection<NamedThing> ThingsList { get; set; }
= new ObservableCollection<NamedThing>
{
new NamedThing {Name = "Short"},
new NamedThing {Name = "VeryVeryLongWord"},
new NamedThing {Name = "Several Words in a Row"}
};
}
/// <summary>
/// Interaction logic for MainWindow.xaml
/// </summary>
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
}
}
只是一个大胆的想法,怎么样使用转换器来分割多一个字的多字串字符串,并将它们放入ViewBox中的某种StackPanel中?我从来没有使用ViewBox,所以我不知道它会工作,但它可能是一个跟踪。 – Kilazur
@Kilazur远远超出我迄今为止所做的任何事情,我不确定我会如何去接近尝试。 –