【问题标题】:Accessing elements inside a DataTemplate in a TabItem在 TabItem 中访问 DataTemplate 内的元素
【发布时间】:2014-06-05 14:10:00
【问题描述】:

好吧,我从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")) 完全用另一个图像控件检查)

提前致谢。

【问题讨论】:

    标签: wpf xaml datatemplate tabitem


    【解决方案1】:

    这是因为它仅在 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
    

    【讨论】:

    • 我不知道为什么,但是我没有找到包含我想要的内容的部分:i.imgur.com/abNdbca.png
    • 用鼠标指向它,然后按Ctrl+Shift。
    • 哦,哈哈,在教程中(youtube.com/watch?v=n8EdRR0Tc1k)我只了解控制(因为我是西班牙人:P)
    • 嗯,最终的结果是不收取任何来源的费用...正如您所见gyazo.com/8d35a5d14669559f009215f929238b9e 那么,现在我该怎么办? D:(我无法继续编码(我想,因为我是 WPF 新手))
    • 也许你在某个地方有另一个同名的图片?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-02
    • 2012-04-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多