2

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

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

这是样式中包含的图像。设置时将其传递给方法“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 的虚拟化模式?

4

2 回答 2

0

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

于 2015-02-28T12:36:14.243 回答
0

当您的属性或其属性值为空时,您是否有可能helpers:ImageExtensions.RemoteURISource不清除?Image.SourceCurrentBackdropUri

于 2013-02-06T16:21:32.297 回答