【问题标题】:Building a tag cloud in WPF在 WPF 中构建标签云
【发布时间】:2011-05-01 12:22:57
【问题描述】:

我正在尝试基于an existing implementation [Download Source] 在 WPF 中构建标签云。我不完全理解实现,我的问题是,我不想将 FontSize 绑定到集合中的项目数,而是想将它绑定到类中包含的其他一些值。所以在这部分,

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

我想将 FontSize 绑定到其他东西。我怎么做? ItemCount 属于哪里?

谢谢

【问题讨论】:

    标签: wpf xaml tag-cloud


    【解决方案1】:

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

    例如如果我有清单

    A A B B B C

    然后我将它们分组:

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

    标签云的全部意义在于绑定到该属性,因为您想可视化某个标签的使用频率。


    为了响应您的 cmets,基本设置应该是这样的:

    <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));
            }
        }
    }
    

    【讨论】:

    • 是的,但我已经有了我的数据,我无法计算它们。我所拥有的更像是 string-int 类型的键值列表,我想制作一个标签云,显示带有 FontSize 其 int 值的字符串。
    • 那么您对该实现的使用绝对为零。您可以将其放入 ItemsControl 并对其进行模板化。好吧,您至少不必重写转换器,但所有的分组魔法都是毫无意义的。
    • 也许这是真的。根据您的建议,标签云是否仍然能够随着列表的变化而动态更新?你能解释一下怎么做吗?
    • 在我的回答中添加了更多信息。
    • @H.B.非常感谢你。我会努力解决问题,如果出现问题,我会回来。
    【解决方案2】:

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

    使用"snoop",您可以在运行时查看 WPF 应用程序的 UI 树,例如找出在任何给定时间存在于 DataContext 中的对象。

    【讨论】:

    • 我不太明白我在用 snoop 寻找什么。我不能将绑定路径设置为其他内容吗?例如,我在主窗口中的整数列表?
    猜你喜欢
    • 1970-01-01
    • 2011-11-11
    • 1970-01-01
    • 2021-08-09
    • 1970-01-01
    • 1970-01-01
    • 2014-05-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多