C# WPF 列表视图 动态个性化每行的字体大小



我正试图使用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依赖于什么?字符串本身。这意味着我们需要将其绑定到项目模板中:

<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。

试图澄清评论中的困惑:

  1. "Path=。"表示"绑定到对象本身"。由于您已经将有问题的字符串作为数据上下文,因此您不希望绑定到它的属性,而是希望绑定到该字符串。

  2. 静态资源必须在容器的Resources集合中定义;例如:

    <UserControl.Resources>
       <local:TabCountStringConverter x:Key="TabCountStringConverter"/>
    </UserControl.Resources>
    

    其中"local"以前定义为xmlns。在评估绑定时使用转换器的返回值,我们在这里所做的是告诉框架使用哪个转换器。如果我们不做一个(如上所述),您将得到一个资源未找到的异常。

最新更新