在WPF中构建标签云

3
我正在尝试在WPF中构建一个基于现有实现 [下载源代码]的标签云。我没有完全理解实现方法,并且我的问题是,我想把FontSize绑定到类中包含的其他值而不是绑定到集合中的项目数量。所以在这里,

FontSize="{Binding Path=ItemCount, Converter={StaticResource CountToFontSizeConverter}}"

我想将字体大小绑定到其他内容上,我该怎么做?ItemCount属于哪里?
谢谢。
2个回答

2

ItemCount 属于从该标签生成的集合视图内的 分组

例如,如果我有一个列表:

A A B B B C

并对它们进行分组,结果如下:

Group A:ItemCount = 2
Group B:ItemCount = 3
Group C:ItemCount = 1

标签云的整个目的就是绑定到这个属性,因为你想可视化某个标签被使用的频率。


针对您的评论,基本设置应该像这样:

<ItemsControl ItemsSource="{Binding Data}">
    <ItemsControl.Resources>
        <vc:CountToFontSizeConverter x:Key="CountToFontSizeConverter"/>
    </ItemsControl.Resources>
    <ItemsControl.ItemsPanel>
        <ItemsPanelTemplate>
            <WrapPanel />
        </ItemsPanelTemplate>
    </ItemsControl.ItemsPanel>
    <ItemsControl.ItemTemplate>
        <DataTemplate>
            <TextBlock Text="{Binding Name}" Margin="2"
                       FontSize="{Binding Count, Converter={StaticResource CountToFontSizeConverter}}"/>
        </DataTemplate>
    </ItemsControl.ItemTemplate>
</ItemsControl>

我假设您的数据对象类公开了属性NameCount,为确保随着计数的增加大小发生变化,该数据对象类需要实现INotifyPropertyChanged,这就是全部内容。

public class Tag : INotifyPropertyChanged
{
    private string _name = null;
    public string Name
    {
        get { return _name; }
        set
        {
            if (_name != value)
            {
                _name = value;
                OnPropertyChanged("Name");
            }
        }
    }

    private int _count = 0;
    public int Count
    {
        get { return _count; }
        set
        {
            if (_count != value)
            {
                _count = value;
                OnPropertyChanged("Count");
            }
        }
    }

    //...

    public event PropertyChangedEventHandler PropertyChanged;

    protected virtual void OnPropertyChanged(string propertyName)
    {
        if (this.PropertyChanged != null)
        {
            this.PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
        }
    }
}

是的,但我已经有了我的数据,我无法计算它们。我拥有的更像是一组键值对列表,类型为字符串-整数,我想制作一个标签云,显示带有FontSize其整数值的字符串。 - user579674
那么你对那个实现就完全没有用处了。你可以把它扔进一个ItemsControl并进行模板化。好吧,至少你不必重写转换器,但所有的分组魔法都是无意义的。 - H.B.
也许是这样。有了您的建议,标签云是否仍然能够在列表更改时动态更新?您能解释一下如何做到这一点吗? - user579674
我在我的回答中添加了更多信息。 - H.B.
vc是我在窗口中定义的自定义xmlns,您可以像之前使用的实现一样定义转换器。顺便说一下,转换器名称甚至相同,但我在这里指定的转换器是我独立编写的实现,而不是之前使用的。 - H.B.
显示剩余5条评论

0

ItemCount是DataContext属性中包含的实例的属性,该属性属于您想要更改FontSize的WPF对象。在层次结构树中,从FrameworkElement开始的所有内容都继承了“DataContext”属性。

使用{{link1:“snoop”}},您可以在运行时查看WPF应用程序的UI树,并确定任何给定时间内DataContext中存在哪些对象。


我并不完全明白我在使用 Snoop 时想要找的东西。我不能只是将绑定路径设置为其他内容吗?例如,我在主窗口中有一个整数列表。 - user579674

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接