0

如何在 C# 编码中访问页面资源元素?我的 XAML 中有以下代码。我想访问image我的 C# 代码中的元素,但它无法访问。

<Page.Resources>
 <DataTemplate x:Key="Standard250x250ItemTemplate">
     <Grid HorizontalAlignment="Left" Width="150" Height="150">
         <Border Background="{StaticResource ListViewItemPlaceholderBackgroundThemeBrush}">
             <Image x:Name="image" Source="{Binding Image}"  Stretch="UniformToFill" AutomationProperties.Name="{Binding Title}" />
         </Border>    
     </Grid>
 </DataTemplate>
4

2 回答 2

1

它不可访问,因为 DataTemplate 资源在加载之前不会被实例化。您需要先执行以下操作才能加载它:

var dataTemplate = (DataTemplate)this.Resources["Standard250x250ItemTemplate"];
var grid = dataTemplate.LoadContent();

然后遍历元素树得到Image。

在许多情况下,更好的方法是定义附加的依赖属性或附加的行为,您可以将其附加到 XAML 中的图像并编写与关联图像相关的代码。

于 2012-11-06T07:19:27.183 回答
0

这取决于您何时尝试访问它。如果尝试访问已经渲染的元素的图像控件,那么您可以像这样使用 ItemContainerGenerator:

    //assumes using a ListView
    var item = (ListViewItem)listView.ItemContainerGenerator.ContainerFromItem(myModel);

    // traverse children
    var image = GetChildOfType<Image>(item);
    // use the image!

private T GetChildOfType<T>(DependencyObject obj)
{
    for(int i = 0; i< VisualTreeHelper.GetChildrenCount(obj); i++)
    {
        var child = VisualTreeHelper.GetChild(obj, i);
        if(child is T) return child as T;

        T item = GetChildOfType<T>(child);
        if(item != null) return item;
    }
    return null;
}

如果您需要更改图像的属性,那么也可以通过绑定来完成。

于 2012-11-07T02:56:04.317 回答