#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. Разве я не могу просто установить путь привязки к чему-то другому? Например, список целых чисел, который у меня есть в моем главном окне?