我正在尝试使用 ListView 在 WPF 中创建一个动态列表。我的代码读入一个文件并将其导入到要显示的列表中。我的意图是每次在字符串中看到制表符时,该行的字体大小将减小 4(从 24 的字体大小开始)。所以所有没有制表符的字符串都是 24,所有有 1 个制表符的字符串都是 20,所有有 2 个制表符的字符串都是 16,等等)。理想情况下,我希望每次向列表中添加行时都设置行样式(至少,我认为这是最简单的)。
所以,理想情况下我会看到这样的东西:
String(Font Size 24)
String(Font Size 20)
String(Font Size 16)
String(Font Size 20)
String(Font Size 16)
And so on.....
我是 WPF 的新手,发现目前很难使用 XAML 对其进行操作。我似乎找不到使每一行都针对样式进行个性化设置的命令。
最佳答案
首先,我们需要设置一个 ItemTemplate
来放置我们的样式控件
<ListView.ItemTemplate>
<DataTemplate>
<TextBlock>
<DataTemplate>
</ListView.ItemTemplate>
其次,FontSize
依赖什么?字符串本身。这意味着我们需要在项目模板中绑定(bind)它:
<TextBlock FontSize="{Binding Text}"/> //Could be "." if binding to List<String>
请注意,我们可以这样做,因为 FontSize
是一个依赖属性。最后,文本显然不是一个数字,所以我们需要一个转换器将其转换为一个:
<TextBlock FontSize="{Binding Path=Text,
Converter={StaticResource TabCountStringConverter}}"/>
public class TabCountStringConverter : IValueConverter
{
public object Convert(...)
{
return (value as String).Count(c => c == '\t'); //Count tabs
}
public object ConvertBack(...)
{
return Binding.DoNothing;
}
}
我没有对我的标签计数功能提出任何要求,但它是一个好的开始:) 它需要一个元素来将标签计数更改为正确的字体大小,也许是一个 Dictionary
。实现完全取决于您。
您也可以在行“容器”控件上设置它,因为它也应该适用于嵌套控件。参见 MSDN .
尝试消除评论中的困惑:
“路径=。”意思是“绑定(bind)到对象本身”。由于您已经将有问题的字符串作为数据上下文,因此您不想绑定(bind)到它的属性,而是想绑定(bind)到字符串。
静态资源必须在容器的
Resources
集合中定义;例如:<UserControl.Resources> <local:TabCountStringConverter x:Key="TabCountStringConverter"/> </UserControl.Resources>
“本地”之前被定义为
xmlns
。在评估绑定(bind)时使用转换器的返回值,我们在这里所做的是告诉框架要使用哪个转换器。如果我们不创建一个(如上所示),您将得到一个资源未找到异常。
关于C# WPF ListView动态个性化每一行的字体大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26221258/