我有一個Windows窗體應用程序中有一個ItemContainerStyleSelector的GridView。樣式中有一個Image控件,它有一個自定義的依賴項屬性來設置源代碼(這樣我就可以獲取圖片的句柄並掛接到卸載的事件)。 我的問題是圖像從未卸載,似乎被重用。這意味着,當我設置源代碼時,圖像也設置在GridView中的其他項目上(例如,我有一個沒有圖像的對象,但滾動後再回來,它有另一個對象的圖像)。強制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>
UPDATE:這個問題似乎是WrapGrid。如果我將其更改爲VirtualizingStack Panel並將VirtualizationMode設置爲Standard,那麼一切都按預期工作,但顯然,我的項目只會出現在一行而不是我想要的多行。
如何設置WrapGrid的虛擬化模式?
它絕對是虛擬化的。這是通過標準虛擬化進行的回收,這導致了我的問題。它繼承自VirtualizingPanel-> OrientatedVirtualizingPanel http://msdn.microsoft.com/en-gb/library/windows/apps/windows.ui.xaml.controls.wrapgrid – Oli
我的不好。所有更有趣的是你的擴展在那裏做什麼。 –
它基本上採用源並將圖像源設置爲Async方法。由於它是一個DP,我可以訪問Image控件,因此不必象轉換器中那樣返回一個空白的BitmapImage。這意味着您在更改圖像時不會在短時間內看到空白圖像。它也等待圖像控制被卸載,因此如果不再需要,Async任務可以被取消。所有這些工作都非常有效,VirtualizationStackPanel的虛擬化設置爲標準化,但使用WrapGrid時,圖像不會被卸載,直到剩下頁面並重新使用相同的圖像控件。 – Oli