C#WPF ListView动态地个别化每一行的字体大小

时间:2014-10-06 17:11:03

标签: c# wpf xaml listview

我尝试使用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很难对其进行操作。我似乎无法找到使每一行按风格个性化的命令。

1 个答案:

答案 0 :(得分:2)

首先,我们需要设置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。实施真的取决于你。

你也可以在行&#34;容器&#34;上设置它。控制,因为它也应该适用于嵌套控件。请参阅MSDN

试图澄清评论中的混淆:

  1. &#34;路径=&#34。意味着&#34;绑定到对象本身&#34;。由于您已经相关字符串作为数据上下文,因此您不希望绑定到它的属性,而是要绑定到字符串。

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

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

    在哪里&#34;本地&#34;以前被定义为xmlns。在评估绑定时使用转换器的返回值,我们在这里做的是告诉框架使用哪个转换器。如果我们不做一个(如上所示),您将获得未找到资源的例外。