Как программно заменить значок TreeViewItem? - PullRequest
0 голосов
/ 01 марта 2012

В моем текущем проекте у меня есть WPF TreeView и добавлены следующие элементы:

<TreeViewItem Name="treeViewItem6" IsEnabled="False">
  <TreeViewItem.Header>
    <StackPanel Orientation="Horizontal">
        <Image Height="16" Source="Images/16x16_green_lamp.png" Width="16" />
        <TextBlock Margin="5,0" Text="Status: Connected" />
    </StackPanel>
  </TreeViewItem.Header>
</TreeViewItem>

Я хотел бы заменить значок, а также текст TextBlock в моем коде C #, чтобы он выглядел следующим образом:

enter image description here

Существует ли простой способ программно заменить значок, а также текст TreeViewItem или мне нужно перебирать все дерево подпунктов? (К сожалению, я новичок в WPF и больше привык к старым добрым WinForms)

Ответы [ 3 ]

1 голос
/ 01 марта 2012

Вместо жесткого кодирования пути к вашему изображению вы можете фактически привязать источник изображения к строковому свойству в вашей ViewModel. Свойство string должно представлять URI для изображения, которое вы хотите отобразить. После изменения свойства строки (и запуска события OnPropertyChanged) ваш пользовательский интерфейс автоматически изменит изображение. В WPF есть встроенный конвертер для изображений, поэтому вам не стоит об этом беспокоиться. Вот как должна выглядеть ваша привязка:

<Image Source="{Binding ImageSource}" />

Где ItemSource - строковое свойство в вашей модели представления.

Надеюсь, это поможет.

1 голос
/ 01 марта 2012

Как вы генерируете дерево?Есть ли там привязка данных?Если дерево создается вручную, почему бы вам просто не дать имена элементам, которые вы хотите изменить, а затем в коде ссылаться на эти элементы:

<TreeViewItem Name="treeViewItem6" IsEnabled="False">
    <TreeViewItem.Header>
        <StackPanel Orientation="Horizontal">
            <Image x:Name="StatusImage" Height="16" Source="Images/16x16_green_lamp.png" Width="16" />
            <TextBlock x:Name="StatusText" Margin="5,0" Text="Status: Connected" />
        </StackPanel>
    </TreeViewItem.Header>
</TreeViewItem>

Затем в коде C #:

...
this.StatusImage.Source="...";  // a new ima
this.StatusText.Text = "....;

Для источника изображения вам необходимо его сгенерировать (недостаточно текста): new BitmapSource (new Uri ("image uri"))

Вы должны создать его один раз и кэшироватьэто.

1 голос
/ 01 марта 2012

Чтобы изменить источник изображения и текст текстового блока, вы можете дать элементам управления имя следующим образом:

<Image Name="imgIcon" Height="16" Source="Images/16x16_green_lamp.png" Width="16" />
<TextBlock Name="tbStatus" Margin="5,0" Text="Status: Connected" />

Таким образом, вы можете легко изменять свойства, которые вы хотите изменить программно, напримерthis:

Image img = FindResource("red") as Image;
if (img != null) imgIcon.Source = img.Source;

tbStatus.Text = "Status: Disconnected";

Чтобы найти «зеленые» и «красные» ресурсы, вы можете добавить их в XAML следующим образом:

<Window.Resources>
    <Image x:Key="green" Source="Images/16x16_green_lamp.png" />
    <Image x:Key="red" Source="Images/16x16_red_lamp.png" />
</Window.Resources>

Конечно, вам потребуется дополнительная логика для определениястатус, но это поможет вам начать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...