2012-11-06 67 views
0

如何訪問C#編碼中的頁面資源元素?我在我的XAML中有以下一段代碼。我想訪問我的C#代碼中的image元素,但它不可訪問。訪問頁面資源元素

<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> 

回答

1

它是不可訪問的,因爲DataTemplate資源直到加載時纔會被實例化。您需要先執行如下操作來加載它:

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

然後遍歷元素樹以獲取圖像。

在很多情況下,更好的方法是定義附加的依賴項屬性或附加行爲,您可以附加到XAML中的圖像並編寫與相關圖像相關的代碼。

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; 
} 

,然後可以通過結合以及完成。