2013-02-06 68 views
2

我有一個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的虛擬化模式?

回答

0

當您的CurrentBackdrop屬性或其Uri屬性值爲空時,您是否有機會helpers:ImageExtensions.RemoteURISource未清除Image.Source

+1

它絕對是虛擬化的。這是通過標準虛擬化進行的回收,這導致了我的問題。它繼承自VirtualizingPanel-> OrientatedVirtualizingPanel http://msdn.microsoft.com/en-gb/library/windows/apps/windows.ui.xaml.controls.wrapgrid – Oli

+0

我的不好。所有更有趣的是你的擴展在那裏做什麼。 –

+0

它基本上採用源並將圖像源設置爲Async方法。由於它是一個DP,我可以訪問Image控件,因此不必象轉換器中那樣返回一個空白的BitmapImage。這意味着您在更改圖像時不會在短時間內看到空白圖像。它也等待圖像控制被卸載,因此如果不再需要,Async任務可以被取消。所有這些工作都非常有效,VirtualizationStackPanel的虛擬化設置爲標準化,但使用WrapGrid時,圖像不會被卸載,直到剩下頁面並重新使用相同的圖像控件。 – Oli

0

你確定加載img源碼的任務在等待時返回默認的ui上下文嗎?我不認爲這是一個好主意設置Image.Source屬性窗體代碼。更好的解決方案是創建一個自定義的可觀察任務類並將其結果綁定到源代碼。在後臺你可以調用任務。你需要控制是圖像嗎?因爲如果它是模板的控件,那麼你會更容易做到這一點。如果你願意的話,我可以派你上課。