Получить изображение в текущем выбранном PanoramaItem
У меня есть Панорама, которая получает динамическое количество элементов на основе привязки данных. В созданном PanoramaItem у меня есть изображение, которое я хочу изменить со временем (постепенно увеличивать / уменьшать различные изображения).
Я видел похожие вопросы, как это: Как получить имя объекта Панорама во время выполнения? но это не работает для меня, так как я никогда не получаю PanoramaItem при использовании Panorama.Items[index]
, Я получаю только экземпляр привязки данных, которую я использую.
Я родом из мира Android, где я мог бы просто использовать что-то вроде findViewById()
чтобы получить конкретное представление. Есть ли что-нибудь подобное в WP8? я знаю FindName()
но то, что используется в моей Панораме, просто возвращает ноль...
Итак, мой вопрос: как я могу получить ссылку на изображение с именем GalleryPreview
в коде позади файла?
Моя страница xaml
<phone:PhoneApplicationPage
x:Class="App.View.AppDetailsPage"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:phone="clr-namespace:Microsoft.Phone.Controls;assembly=Microsoft.Phone"
xmlns:shell="clr-namespace:Microsoft.Phone.Shell;assembly=Microsoft.Phone"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable="d"
FontFamily="{StaticResource PhoneFontFamilyNormal}"
FontSize="{StaticResource PhoneFontSizeNormal}"
Foreground="{StaticResource PhoneForegroundBrush}"
SupportedOrientations="Portrait" Orientation="Portrait"
shell:SystemTray.IsVisible="False" >
<phone:PhoneApplicationPage.Resources>
<DataTemplate x:Key="PanoramaHeaderTemplate">
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="72"/>
<ColumnDefinition Width="Auto"/>
</Grid.ColumnDefinitions>
<Image Source="{Binding AppStoreIcon}"
Width="64" Height="64"
Grid.Column="0"
HorizontalAlignment="Left"/>
<TextBlock x:Name="ItemTitle"
Text="{Binding os}"
Grid.Column="1"/>
</Grid>
</DataTemplate>
<DataTemplate x:Key="PanormaItemTemplate">
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="2*"/>
<ColumnDefinition Width="*"/>
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition Height="Auto"/>
<RowDefinition Height="Auto"/>
<RowDefinition Height="Auto"/>
<RowDefinition Height="Auto"/>
<RowDefinition Height="Auto"/>
<RowDefinition Height="Auto"/>
<RowDefinition Height="Auto"/>
<RowDefinition Height="Auto"/>
</Grid.RowDefinitions>
<TextBlock Text="{Binding storeName}" FontSize="24"
Grid.Row="0" Grid.Column="0" Grid.ColumnSpan="2"/>
<TextBlock Text="Rating" FontSize="24"
Grid.Row="1" Grid.Column="0"/>
<TextBlock Text="{Binding rating}" FontSize="24"
Grid.Row="1" Grid.Column="1"/>
<TextBlock Text="5 Stars: " FontSize="24"
Grid.Row="2" Grid.Column="0"/>
<TextBlock Text="{Binding starsFive}" FontSize="24"
Grid.Row="2" Grid.Column="1"/>
<TextBlock Text="4 Stars: " FontSize="24"
Grid.Row="3" Grid.Column="0"/>
<TextBlock Text="{Binding starsFour}" FontSize="24"
Grid.Row="3" Grid.Column="1"/>
<TextBlock Text="3 Stars: " FontSize="24"
Grid.Row="4" Grid.Column="0"/>
<TextBlock Text="{Binding starsThree}" FontSize="24"
Grid.Row="4" Grid.Column="1"/>
<TextBlock Text="2 Stars: " FontSize="24"
Grid.Row="5" Grid.Column="0"/>
<TextBlock Text="{Binding starsTwo}" FontSize="24"
Grid.Row="5" Grid.Column="1"/>
<TextBlock Text="1 Stars: " FontSize="24"
Grid.Row="6" Grid.Column="0"/>
<TextBlock Text="{Binding starsOne}" FontSize="24"
Grid.Row="6" Grid.Column="1"/>
<StackPanel Grid.ColumnSpan="2" Grid.Row="7"
ManipulationStarted="AppItemManipulationStarted"
ManipulationCompleted="AppItemManipulationCompleted">
<Image x:Name="GalleryPreview" Source="/Assets/images/blub.png"/>
</StackPanel>
</Grid>
</DataTemplate>
</phone:PhoneApplicationPage.Resources>
<!--LayoutRoot contains the root grid where all other page content is placed-->
<Grid x:Name="LayoutRoot">
<phone:Panorama x:Name="AppPanorama" Title="Title"
ItemsSource="{Binding}"
SelectionChanged="PanoramaSelectionChanged"
HeaderTemplate="{StaticResource PanoramaHeaderTemplate}"
ItemTemplate="{StaticResource PanormaItemTemplate}">
</phone:Panorama>
</Grid>
</phone:PhoneApplicationPage>
Когда я пытаюсь использовать FindName("GalleryPreview")
LogUtil.Log(AppPanorama.FindName("GalleryPreview") == null ? "null" : AppPanorama.FindName("GalleryPreview"));
LogUtil.Log(LayoutRoot.FindName("GalleryPreview") == null ? "null" : LayoutRoot.FindName("GalleryPreview"));
LogUtil.Log(AppPanorama.SelectedItem);
// output:
// null
// null
// App.Model.Store
3 ответа
@wankr направил меня в правильном направлении, хотя его ссылка не помогла мне полностью.
Я хотел получить доступ к изображению, чтобы изменить отображаемый источник на основе таймера.
Вот что содержит мой OnTick для получения ссылки на изображение:
ImageSourceConverter converter = new ImageSourceConverter();
PanoramaItem myPanoramaItem = (PanoramaItem)(AppPanorama.ItemContainerGenerator.ContainerFromItem(AppPanorama.Items[_selectedIndex]));
Image galleryItem = (Image)FindVisualChild<Image>("GalleryPreview", myPanoramaItem);
galleryItem.Source = (ImageSource)converter.ConvertFromString(gallery[_galleryIndex]);
"GalleryPreview" - это имя изображения, к которому я хочу получить доступ. Поскольку у меня есть несколько изображений в моем макете, мне нужно было расширить метод FindVisualChild
Я нашел по ссылке от @wankr.
public static ChildItem FindVisualChild<ChildItem>(String name, DependencyObject obj) where ChildItem : DependencyObject
{
for (int i = 0; i < VisualTreeHelper.GetChildrenCount(obj); i++)
{
DependencyObject child = VisualTreeHelper.GetChild(obj, i);
FrameworkElement uiChild = (FrameworkElement)child;
if (child != null && child is ChildItem && uiChild.Name.Equals(name))
{
return (ChildItem)child;
}
else
{
ChildItem childOfChild = FindVisualChild<ChildItem>(name, child);
if (childOfChild != null)
{
return childOfChild;
}
}
}
return null;
}
Control.GetTemplateChild может быть то, что вы ищете.
Шаблоны имеют автономную область имен. Это связано с тем, что шаблоны используются повторно, и любое имя, определенное в шаблоне, не может оставаться уникальным, как только несколько экземпляров элемента управления создают каждый экземпляр своего шаблона. Вызовите GetTemplateChild, чтобы вернуть ссылки на объекты, которые приходят из шаблона после его создания. Вы не можете использовать FindName для поиска элементов из шаблонов, потому что FindName действует в более общей области, и нет никакой связи между самим классом ControlTemplate и созданным экземпляром шаблона после его применения.
последняя попытка Как: найти элементы, сгенерированные DataTemplate
Попробуйте это и посмотрите, поможет ли это:
Image newImg = new Image();
newImg = LayoutRoot.FindName("GalleryPreview") as Image;