【问题标题】:C# WPF ListView Individualize each row's font size dynamicallyC# WPF ListView 动态个性化每一行的字体大小
【发布时间】:2014-10-06 17:11:03
【问题描述】:

我正在尝试使用 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 操作它非常困难。我似乎找不到让每一行都个性化风格的命令。

【问题讨论】:

    标签: c# wpf xaml listview


    【解决方案1】:

    首先,我们需要设置一个ItemTemplate 来容纳我们的样式控件

    <ListView.ItemTemplate>
       <DataTemplate>
          <TextBlock>
       <DataTemplate>
    </ListView.ItemTemplate>
    

    其次,FontSize 依赖于什么?字符串本身。这意味着我们需要在item模板中绑定它:

    <TextBlock FontSize="{Binding Text}"/> //Could be "." if binding to List<String>
    

    请注意,我们可以这样做,因为FontSize 是一个依赖属性。最后,文本显然不是数字,所以我们需要一个converter来把它变成一个:

    <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

    尝试消除 cmets 的困惑:

    1. “路径=。”意思是“绑定到对象本身”。由于您已经拥有有问题的字符串作为数据上下文,因此您不想绑定到它的属性,而是想绑定到字符串。

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

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

      “本地”之前定义为xmlns。在评估绑定时使用转换器的返回值,我们在这里所做的是告诉框架使用哪个转换器。如果我们不制作(如上所示),您将收到资源未找到异常。

    【讨论】:

    • 感谢您的快速反馈。我对转换器的使用有点困惑。我有一个 List 指定了我要插入到显示中的字符串值。转换器是否在每一行都被调用?
    • @Scintir 是的。更具体地说,每次绑定评估时都会调用转换器,当然,每一行都会发生这种情况。每次更改支持字段时也会发生这种情况(假设该对象上的INotifyPropertyChanged 可以工作,而List&lt;String&gt; 则不会)。
    • 我想我开始对结构有点了解了;但是,我仍然有一点问题。我收到一条错误消息“附加信息:在 'System.Windows.Baml2006.TypeConverterMarkupExtension' 上提供值引发异常。”运行程序时。它似乎围绕着新增的 XAML 代码。我已添加: 数据模板>
    • 嘿,对不起。我仍然对语法感到困惑。我认为这可能只是一些参数设置。我还做了一个复制/粘贴错误,缺少 DataTemplate。我现在拥有的文本块是: 我不明白 Path=.适用于字符串。至于静态资源,不是在返回值上设置的吗?如果是这样,我将其设置为:'string TabCount = null;' 'TabCount = value.ToString().Count(ch => ch == '\t').ToString();' '返回 TabCount;'谢谢!
    • @Scintir 查看我的编辑。您还需要返回 double 而不是字符串,因为这是 FontSize 所期望的。
    猜你喜欢
    • 2018-01-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-26
    相关资源
    最近更新 更多