强制GridView创建不回收控件

时间:2013-02-06 12:03:54

标签: windows-runtime winrt-xaml windows-store-apps

我在Windows商店应用程序中有一个GridView,它有一个ItemContainerStyleSelector。在样式中是一个Image控件,它具有一个自定义依赖项属性来设置源(这样我就可以获得Image的句柄并挂钩到卸载的事件)。 我的问题是Image永远不会被卸载,似乎可以重用。这意味着当我设置源时,图像也会在GridView中的其他项目上设置(例如,我有一个没有图像的对象,但滚动后然后再返回它有另一个对象的图像)。 / p>

我尝试将虚拟化模式设置为标准,但我没有帮助。任何想法都将不胜感激。

这是样式中包含的图像。设置时将其传递给方法“OnRemoteURISourceChanged”。无论何时调用该方法,我都期望有不同的图像控制,但事实并非如此。

<Image x:Name="BackgroundImage" DataContext="{Binding CurrentBackdrop}" helpers:ImageExtensions.RemoteURISource="{Binding Uri}" Stretch="UniformToFill"/>

这是我的GridView

<GridView x:Name="ItemsGrid" Grid.Row="1" ItemsSource="{Binding BrowseResults}" SelectedItem="{Binding SelectedItem, Mode=TwoWay}" Margin="20,0,20,0"
              IsItemClickEnabled="True" ItemClick="ItemsGrid_ItemClick" VirtualizingStackPanel.VirtualizationMode="Standard">
        <GridView.ItemContainerStyleSelector>
            <controls:UPnPCDStyleSelector CDObject="{StaticResource somestyle1}" Container="{StaticResource somestyle2}" Item="{StaticResource somestyle3}"/>
        </GridView.ItemContainerStyleSelector>
        <GridView.ItemsPanel>
            <ItemsPanelTemplate VirtualizingStackPanel.VirtualizationMode="Standard">
                <WrapGrid Orientation="Vertical" VirtualizingStackPanel.VirtualizationMode="Standard"/>
            </ItemsPanelTemplate>
        </GridView.ItemsPanel>
    </GridView>

更新:问题似乎是WrapGrid。如果我将其更改为VirtualizingStack面板并将VirtualizationMode设置为Standard,那么一切都按预期工作,但显然我的项目只出现在一行而不是多行,如我所愿。

如何设置WrapGrid的虚拟化模式?

2 个答案:

答案 0 :(得分:0)

当您的helpers:ImageExtensions.RemoteURISource属性或其Image.Source属性值为空时,CurrentBackdrop是否有可能无法清除Uri

答案 1 :(得分:0)

在等待时,你确定加载img源的任务会返回默认的ui上下文吗?我不认为设置Image.Source属性表单代码是个好主意。更好的解决方案是创建一个自定义的可观察任务类,并将im源绑定到它的结果。在后台,您可以调用该任务。你需要控件是Image吗?因为如果它是一个带模板的控件,那么你就更容易做到。如果你愿意的话,我可以把你的课程发给你。