我有一個ListView,UserControl作為ItemTemplate。問題是,在過濾和搜索專案后,專案發生了變化,專案被混在一起。例如,尚未下載的專案被顯示為已下載,而已下載的專案被顯示為未下載。
問題是,我如何使每個專案單獨作業,并且不影響其他專案?
這是我的ListView
<ListView ItemsSource="{x:Bind SubtitlesACV, Mode=OneWay}" >
<ListView.ItemTemplate>
<DataTemplate x:DataType="model:SubsceneDownloadModel" >
<usercontrol:SubsceneUserControl
Title="{x:系結標題}"
Link="{x:Bind Link}"
SubtitleLanguage="{x:系結語言}"
Translator="{x:Bind Translator}"/>
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
這是我的Usercontrol
<Grid>
<SwipeControl x:Name="ListViewSwipeContainer" >
<Grid VerticalAlignment="Center">
<Grid.RowDefinitions>
<RowDefinition Height="auto"/>
<RowDefinition Height="auto"/>
</Grid.RowDefinitions>
<TextBlock.../>
<StackPanel
Grid.RowSpan="2"
水平對齊="右"
垂直對齊="中心"
Orientation="Horizontal">
<AppBarButton
Name="OpenFolderButton"
MinWidth="75"
邊距="10,0,10,0"
Click="OpenFolderButton_Click"
Icon="OpenLocal"
IsTabStop="False"
標簽="打開檔案夾"
Visibility="Collapsed"/>
<ProgressRing
名稱="進度狀態"
邊距="10,0,10,0"
Visibility="Collapsed"/>
<AppBarButton
名稱="DownloadHoverButton"
邊距="10,0,10,0"
Click="DownloadHoverButton_Click"
圖示="下載"
IsTabStop="False"
標簽="下載"
Visibility="Collapsed"/>
</StackPanel>
</Grid>
</SwipeControl>
<VisualStateManager.VisualStateGroups>
<VisualStateGroup x:Name="HoveringStates">
<VisualState x:Name="HoverButtonsHidden"/>
<VisualState x:Name="HoverButtonsShown">
<VisualState.Setters>
<Setter Target="DownloadHoverButton.Visibility" Value="Visible"/>
</VisualState.Setters>
</VisualState>
</VisualStateGroup>
</VisualStateManager.VisualStateGroups>
</Grid>
這是指標事件的后面的代碼
private void UserControl_PointerEntered(object sender, PointerRoutedEventArgs e)
{
如果(e.Pointer.PointerDeviceType == Windows.Devices.Input.PointerDeviceType.Mouse ||
e.Pointer.PointerDeviceType == Windows.Device.Input.PointerDeviceType.Pen)
{
VisualStateManager.GoToState(sender as Control, "HoverButtonsShown", true)。
}
}
private void UserControl_PointerExited(object sender, PointerRoutedEventArgs e)
{
VisualStateManager.GoToState(sender as Control, "HoverButtonsHidden", true)。
}
這段代碼是通過數字框和AutoSuggestBox進行過濾(SubtitlesACV是AdvancedCollectionView)
SubtitlesACV.Filter = SubtitleFilter;
private bool SubtitleFilter(object subtitle)
{
var query = subtitle as SubsceneDownloadModel;
var selectedLanguage = cmbLanguage.SelectedItem as string;
var selectedQuality = cmbQuaity.SelectedItem as string;
if (string.IsNullOrEmpty(selectedQuality) || string.IsNullOrEmpty(selectedLanguage))
回傳false。
var name = query.Name ? "";
var translator = query.Translator ?? "";
var comment = query.Comment ?"? "";
var language = query.Language ?? "";
if (selectedLanguage.Equals(Consts.ALL_Language))
selectedLanguage = "";
如果(selectedQuality.Equals(Consts.ALL_Qualities))
selectedQuality = ""。
var episode = $"E{nbEpisode.Value.ToString("00")}"。
if (double.IsNaN(nbEpisode.Value) || nbEpisode.Value == 0)
episode = ""。
return (name.Contains(selectedQuality, StringComparison.OrdinalIgnoreCase)
|| translator.Contains(selectedQuality, StringComparison.OrdinalIgnoreCase)
|| comment.Contains(selectedQuality, StringComparison.OrdinalIgnoreCase))
&& language.Contains(selectedLanguage, StringComparison.OrdinalIgnoreCase)
&& (name.Contains(AutoSuggest.Text, StringComparison.OrdinalIgnoreCase)
||翻譯.包含(AutoSuggest.Text, StringComparison.OrdinalIgnoreCase)
|| comment.Contains(AutoSuggest.Text, StringComparison.OrdinalIgnoreCase))
&& (name.Contains( episode, StringComparison.OrdinalIgnoreCase)
|| translator.Contains(plisode, StringComparison.OrdinalIgnoreCase)
|| comment.Contains(plisode, StringComparison.OrdinalIgnoreCase))。
}
首先,第16集被下載,出現了打開檔案夾的按鈕。可以看出,第17、18和19集顯示了下載按鈕 這是完全正確的。
現在,如果我們用以下代碼過濾集數,一個尚未下載的專案將顯示打開檔案夾按鈕,這是錯誤的。
現在,如果我們從AutoSuggestBox中搜索第16集(先前已下載),所有專案將變為未下載模式。
uj5u.com熱心網友回復:
首先,你的行為的原因是UI虛擬化。這意味著代表專案的UI元素是按需創建的。面板有時會重復使用一些專案,這就是你得到這種行為的原因。目前,在使用UI virtualization時,還沒有好的方法來解決這個問題。
如果你沒有大量的資料,你可以只使用StackPanel,它不啟用UI虛擬化。但是如果你有大量的資料,那么你需要自己優化性能。例如,將資料切割成不同的部分,一次只加載部分資料。當需要時再加載其他部分的資料。通過這種方式,你可以避免這種行為。
如果你有大量的資料,而你仍然想使用UI虛擬化,你可以做的是清除usercontrol中的快取資料。例如,當加載usercontrol或將資料傳入usercontrol時,清除該值并手動設定該值。但是你仍然不能完全避免這種行為。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/315711.html
標籤:
