获取图像在当前选择PanoramaItem(Get Image in currently selec

2019-10-29 19:24发布

我有一个全景系统会根据数据绑定表项的动态量。 在所创建的PanoramaItem,我有我想随时间修改影像(淡入/淡出不同随时间的图像)。

我看到这样类似的问题: 如何检索在运行一个全景,项目的名称? 但是,这并不为我工作,当我使用,我从来没有得到一个PanoramaItem Panorama.Items[index] 。 我只得到了数据的实例,结合我使用。

我来自Android的世界里,我可以简单的使用类似findViewById()获取特定视图。 有什么在WP8相似? 我知道FindName()但在我的全景使用简单地返回null ...

所以我的问题是:我如何获得命名的图像的参考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

Answer 1:

Control.GetTemplateChild可能是你在找什么。

模板有一个独立的名称范围。 这是因为模板被重新使用,并且在模板中定义的任何名称不能保持一次控制的多个实例,每一个独特的实例化模板。 为了引用返回到来自它的模板实例化后的对象调用GetTemplateChild。 不能使用FindName来找到模板项,因为FindName在更广泛的范围内起作用,并且存在的ControlTemplate类自身与实例化模板,一旦它被应用之间没有任何联系。

最后尝试如何:查找的DataTemplate生成的元素



Answer 2:

试试这个,看看是否有帮助:

Image newImg = new Image();
newImg = LayoutRoot.FindName("GalleryPreview") as Image;


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


文章来源: Get Image in currently selected PanoramaItem