在TabItem中访问DataTemplate内的元素

时间:2014-04-21 13:40:40

标签: wpf xaml datatemplate tabitem

,我从there

获得的功能有问题

[VB.NET]

Public Class TreeHelper

Public Shared Function FindVisualChildByName(Of T As FrameworkElement)(parent As DependencyObject, name As String) As T
    Dim child As T = Nothing
    For i As Integer = 0 To VisualTreeHelper.GetChildrenCount(parent) - 1
        Dim ch = VisualTreeHelper.GetChild(parent, i)
        child = TryCast(ch, T)
        If child IsNot Nothing AndAlso child.Name = name Then
            Exit For
        Else
            child = FindVisualChildByName(Of T)(ch, name)
        End If

        If child IsNot Nothing Then
            Exit For
        End If
    Next
    Return child
End Function

End Class

和XAML部分:

<TabItem x:Name="itemControls" 
     Height="50"
     Margin="0"
     VerticalAlignment="Top"
     HorizontalContentAlignment="Stretch"
     VerticalContentAlignment="Stretch"
     Padding="6,1">
<TabItem.HeaderTemplate>
    <DataTemplate>
        <StackPanel Orientation="Horizontal">
            <Image x:Name="iconKB"
                   Width="25"
                   Height="25"
                   Stretch="Fill" />
        </StackPanel>
    </DataTemplate>
</TabItem.HeaderTemplate>
</TabItem>

因此,我尝试使用以下语法编辑iconKB图像的源代码:

TreeHelper.FindVisualChildByName(Of Image)(itemControls, "iconKB").Source = New BitmapImage(New Uri("pack://application:,,,/Resources/icons/Keyboard.png"))

但由于某种原因它不会改变。它一直是空白。 (问题不在于New BitmapImage(New Uri("pack://application:,,,/Resources/icons/Keyboard.png")),而是用另一个图像控件完全检查了它)

提前致谢。

1 个答案:

答案 0 :(得分:2)

因为它只在DataTemplate的名称范围内定义。想一想,当你运行你的应用程序时,你可以拥有大量的应用程序,并且所有这些都不能被称为iconKB。

编辑:好的我检查了你的代码。没关系。使它不正常的事情是你试图找到一个尚未在VisualTree中的元素,因为该选项卡未打开。因此找不到图像。 如果你在Loaded事件处理程序中编写它,它将起作用。

Private Shadows Sub TSLoaded() Handles tabSettings.Loaded
    TreeHelper.FindVisualChildByName(Of Image)(itemControls, "iconKB").Source = New BitmapImage(New Uri("pack://application:,,,/Resources/icons/Keyboard.png"))
    TreeHelper.FindVisualChildByName(Of Image)(itemMouse, "iconMouse").Source = New BitmapImage(New Uri("pack://application:,,,/Resources/icons/Mouse.png"))
    TreeHelper.FindVisualChildByName(Of Image)(itemAudio, "iconAudio").Source = New BitmapImage(New Uri("pack://application:,,,/Resources/icons/Audio.png"))
    TreeHelper.FindVisualChildByName(Of Image)(itemVideo, "iconVideo").Source = New BitmapImage(New Uri("pack://application:,,,/Resources/icons/Video.png"))
    TreeHelper.FindVisualChildByName(Of Image)(itemSettings, "iconSettings").Source = New BitmapImage(New Uri("pack://application:,,,/Resources/icons/Settings.png"))
End Sub