Создание облака тегов в WPF

#wpf #xaml #tag-cloud

#wpf #xaml #облако тегов

Вопрос:

Я пытаюсь создать облако тегов в WPF на основе существующей реализации [Загрузить исходный код]. Я не совсем понял реализацию, и моя проблема в том, что вместо привязки размера шрифта к количеству элементов в коллекции я хочу привязать его к некоторым другим значениям, содержащимся в классе. Итак, в этой части здесь,

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

Я хочу привязать размер шрифта к чему-то другому. Как мне это сделать? К чему относится ItemCount?

Спасибо

Ответ №1:

ItemCount принадлежит к группе внутри представления коллекции, которое создается на основе этого тега.

например, если у меня есть список

A A B B B C

И я группирую их, я получаю:

Группа A: количество элементов = 2
Группа B: количество элементов = 3
Группа C: количество элементов = 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>
  

Я предполагаю, что ваш класс объектов данных предоставляет свойства Name и Count , чтобы убедиться, что размер изменяется по мере увеличения количества, которое необходимо реализовать классу объектов данных 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));
        }
    }
}
  

Комментарии:

1. Да, но у меня уже есть мои данные, и я не могу их сосчитать. То, что у меня есть, больше похоже на список ключевых значений типа string-int, и я хочу создать облако тегов, показывающее строку с FontSize ее значением int.

2. Тогда у вас нет абсолютно никакого смысла в этой реализации. Вы можете просто поместить это в ItemsControl и создать его шаблон. Ну, по крайней мере, вам не придется переписывать конвертер, но вся магия группировки бессмысленна.

3. Возможно, это правда. Согласно вашему предложению, сможет ли облако тегов по-прежнему динамически обновляться при изменении списка? Можете ли вы объяснить, как это сделать?

4. Добавил еще немного информации к моему ответу.

5. @H.B. Большое вам спасибо. Я поработаю над этим и вернусь, если что-то пойдет не так.

Ответ №2:

ItemCount — это свойство любого экземпляра, содержащегося в свойстве DataContext объекта WPF, размер шрифта которого вы хотите изменить. В иерархическом дереве все, начиная с FrameworkElement этого момента, наследует свойство «DataContext».

С помощью «snoop» вы можете заглянуть в дерево пользовательского интерфейса приложения WPF во время выполнения и, например, выяснить, какие объекты находятся в вашем DataContext в любой момент времени.

Комментарии:

1. Я не совсем понимаю, что я ищу с помощью snoop. Разве я не могу просто установить путь привязки к чему-то другому? Например, список целых чисел, который у меня есть в моем главном окне?