我即将把我的头发脱落,但在我这样做之前,我会试着请你们帮忙…也许有人有同样的问题,可以帮助我。
所以这里是交易。 我有一个名为SourceZoneselect的LongListSelector定义如下:
<phone:LongListSelector x:Name="SourceZoneselect" Grid.Row="2" LayoutMode="Grid" GridCellSize="160,160" BorderThickness="0" HorizontalContentAlignment="Stretch" VerticalContentAlignment="Stretch" Background="White" Width="480" Foreground="Black" ItemTemplate="{StaticResource DataTemplateContentZone}" {StaticResource LongListSelectorStyleContentZone}" ScrollViewer.VerticalScrollBarVisibility="Visible" Margin="-2,0"/>
ItemTemplate是一个DataTemplateSelector,如下所示:
<DataTemplate x:Key="DataTemplateContentZone"> <local:ContentZoneTemplateSelector Content="{Binding}" VerticalAlignment="Top" HorizontalAlignment="Right"> ... <local:ContentZoneTemplateSelector.PhotoWebSelect> <DataTemplate> <Grid Height="158" Width="158"> <Button BorderThickness="0" {StaticResource ButtonStyleStyle}" Width="158" Height="158" toolkit:TiltEffect.IsTiltEnabled="True" Click="Button_SourceZone_Select_Click"> <Grid HorizontalAlignment="Left" Height="158"> <Rectangle Fill="{StaticResource StayfilmThirdColor}" HorizontalAlignment="Left" Height="158" stroke="Black" VerticalAlignment="Top" Width="158"/> <Image x:Name="img" Stretch="UniformToFill" Width="158" Height="158" Source="{Binding Thumb}" Tag="{Binding imgurl}"/> <Grid x:Name="GridSelected" Tag="{Binding idMedia}" HorizontalAlignment="Right" Height="35" VerticalAlignment="Top" Width="35" Background="#FF0E9B00" Visibility="{Binding selected,Converter={StaticResource PhotoSelectedConverter}}"> <Path Data="F1M0.555,6.585L0.089,6.077C-0.036,5.942,-0.029,5.73,0.107,5.605L1.464,4.344C1.525,4.287 1.606,4.255 1.689,4.255 1.785,4.255 1.871,4.293 1.935,4.361L5.661,8.373 12.07,0.126C12.134,0.047 12.23,0 12.334,0 12.41,0 12.481,0.024 12.54,0.07L14.003,1.206C14.073,1.26 14.117,1.339 14.128,1.429 14.141,1.518 14.116,1.606 14.061,1.674L5.826,12.263z" Fill="White" Margin="0" UseLayoutRounding="False" VerticalAlignment="Center" HorizontalAlignment="Center"/> </Grid> </Grid> </Button> </Grid> </DataTemplate> </local:ContentZoneTemplateSelector.PhotoWebSelect> <local:ContentZoneTemplateSelector.VideoSelect> <DataTemplate> <Grid Height="158" Width="158"> <Button BorderThickness="0" {StaticResource ButtonStyleStyle}" Width="Auto" Height="Auto" toolkit:TiltEffect.IsTiltEnabled="True" Click="Button_SourceZone_Select_Click"> <Grid Height="158" Width="158"> <Image x:Name="videoThumb" Stretch="Fill" Width="158" Height="158" Source="{Binding VideoThumbUrl}"/> <Image HorizontalAlignment="Center" Height="80" VerticalAlignment="Center" Width="80" Source="/Assets/Dark/feature.video.png"/> <Grid x:Name="GridSelected" Tag="{Binding idMedia}" HorizontalAlignment="Right" Height="35" VerticalAlignment="Top" Width="35" Background="#FF0E9B00" Visibility="{Binding Selected,Converter={StaticResource VideoSelectedConverter}}"> <Path Data="F1M0.555,12.263z" Fill="White" Margin="0" UseLayoutRounding="False" VerticalAlignment="Center" HorizontalAlignment="Center"/> </Grid> </Grid> </Button> </Grid> </DataTemplate> </local:ContentZoneTemplateSelector.VideoSelect> ... </local:ContentZoneTemplateSelector> </DataTemplate>
还有2个值转换器:
in .xaml file <phone:PhoneApplicationPage.Resources> <local:PhotoSelectedConverter x:Name="PhotoSelectedConverter"/> <local:VideoSelectedConverter x:Name="VideoSelectedConverter"/> in .cs file public class PhotoSelectedConverter : IValueConverter { public object Convert(object value,Type typeName,object parameter,CultureInfo language) { bool selected = (bool)value; if (!selected) { return "Collapsed"; } else { return "Visible"; } } public object ConvertBack(object value,CultureInfo language) { return DependencyProperty.UnsetValue; } } public class VideoSelectedConverter : IValueConverter { public object Convert(object value,CultureInfo language) { double selected = (double)value; if (selected == 0.0) { return "Collapsed"; } else { return "Visible"; } } public object ConvertBack(object value,CultureInfo language) { return DependencyProperty.UnsetValue; } }
这是直接制作在数据模板上定义的名为GridSelected的Grid的代码,就好像item绑定 – > selected属性为false,GridSelected应该是Collapsed,如果它是true,那么它应该是Visible …
这里是代码:
... List<StayClassLibrary.Media> medias = await Media.GetMediasByAlbum(albmLst,App.Current.AppUser,App.Current.WSConfig); if (selectedSourceZone.Count > 0) { selectedSourceZone.Clear(); } selectedSourceZone = null; selectedSourceZone = new ObservableCollection<Idisposable>(); SourceZoneselect.ClearValue(LongListSelector.DataContextProperty); SourceZoneselect.ClearValue(LongListSelector.ItemsSourceProperty); SourceZoneselect.UpdateLayout(); popupsourceZone_Select.UpdateLayout(); GridSourceZoneselect.UpdateLayout(); if (medias.Count == 0) { NoImagesFound.Visibility = System.Windows.Visibility.Visible; } else { NoImagesFound.Visibility = System.Windows.Visibility.Collapsed; //Todo criar PictureItems foreach (StayClassLibrary.Media item in medias) { BitmapImage b = new BitmapImage(); b.UriSource = new Uri(item.thumbnail,UriKind.RelativeOrAbsolute); b.ImageFailed += b_ImageFailed; bool found = false; foreach (var media in selectedContentZone) { if(media.GetType() == typeof(PictureItemWeb)) { if(((PictureItemWeb)media).idMedia == item.idMidia) { if (!selectedSourceMedias.Contains(item.idMidia.ToString())) { found = true; } break; } } else if(media.GetType() == typeof(VideoItem)) { if (((VideoItem)media).idMedia == item.idMidia) { if (!selectedSourceMedias.Contains(item.idMidia.ToString())) { found = true; } break; } } } if (item.type == "image") { selectedSourceZone.Insert(0,new PictureItemWeb { Thumb = b,Pic = new BitmapImage(new Uri(item.source,UriKind.RelativeOrAbsolute)),dateBinary = DateTime.Now.ToBinary(),idAlbum = item.idAlbum,idMedia = item.idMidia,imgurl = item.source,ThumbUrl = item.thumbnail,selected = false,selectable = true,added = found,cancellationToken = new CancellationTokenSource() }); } else if (item.type == "video") { selectedSourceZone.Insert(0,new VideoItem { Thumb = b,VideoUrl = item.source,VideoThumbUrl = item.thumbnail,Selected = 0.0,cancellationToken = new CancellationTokenSource() }); } b = null; } if (selectedSourceZone.Count > 0) { Storyboard sb = new Storyboard(); DoubleAnimation fadein = new DoubleAnimation(); fadein.From = 0.0; fadein.To = 1.0; fadein.Duration = new Duration(TimeSpan.FromSeconds(0.35)); Storyboard.SetTarget(fadein,SourceZoneselect); Storyboard.SetTargetProperty(fadein,new PropertyPath("Opacity")); sb.Children.Add(fadein); sb.Begin(); SourceZoneselect.ItemsSource = null; SourceZoneselect.ClearValue(LongListSelector.DataContextProperty); SourceZoneselect.ClearValue(LongListSelector.ItemsSourceProperty); SourceZoneselect.ItemsSource = selectedSourceZone; // *1 foreach (var item in selectedSourceZone) { if(item.GetType() == typeof(PictureItemWeb)) { if(selectedSourceMedias.Contains(((PictureItemWeb)item).idMedia.ToString())) { ((PictureItemWeb)item).selected = true; } } else if (item.GetType() == typeof(VideoItem)) { if (selectedSourceMedias.Contains(((VideoItem)item).idMedia.ToString())) { ((VideoItem)item).Selected = 1.0; } } UpdateSelectedState(SourceZoneselect,item); // *2 } } else { NoImagesFound.Visibility = System.Windows.Visibility.Visible; Storyboard sb = new Storyboard(); DoubleAnimation fadein = new DoubleAnimation(); fadein.From = 0.0; fadein.To = 1.0; fadein.Duration = new Duration(TimeSpan.FromSeconds(0.35)); Storyboard.SetTarget(fadein,NoImagesFound); Storyboard.SetTargetProperty(fadein,new PropertyPath("Opacity")); sb.Children.Add(fadein); sb.Begin(); } }
* 1在这里,当我设置SourceZoneselect.ItemsSource = selectedSourceZone; 它应该激活IValueConverter它不…我有一个断点在那里,它永远不会经过那里。
* 2这个函数UpdateSelectedState()我创build了试图手动修复和更新每个媒体的GridSelected可见性
private void UpdateSelectedState(DependencyObject targetElement,object item) { var count = VisualTreeHelper.GetChildrenCount(targetElement); if (count == 0) return; for (int i = 0; i < count; i++) { var child = VisualTreeHelper.GetChild(targetElement,i); if (child is Button) { Button targetItem = (Button)child; if (item.GetType() == typeof(PictureItemWeb)) { if (((PictureItemWeb)targetItem.DataContext).idMedia == ((PictureItemWeb)item).idMedia) { var g = targetItem.FindName("GridSelected"); if (((Guid)((Grid)g).Tag) == ((PictureItemWeb)item).idMedia) { if (((PictureItemWeb)item).selected) { ((Grid)g).Visibility = System.Windows.Visibility.Visible; } else { ((Grid)g).Visibility = System.Windows.Visibility.Collapsed; } } return; } } else if (item.GetType() == typeof(VideoItem)) { if (((VideoItem)targetItem.DataContext).idMedia == ((VideoItem)item).idMedia) { var g = targetItem.FindName("GridSelected"); if (((VideoItem)item).Selected == 1.0) { ((Grid)g).Visibility = System.Windows.Visibility.Visible; } else { ((Grid)g).Visibility = System.Windows.Visibility.Collapsed; } return; } return; } } else { UpdateSelectedState(child,item); } } }
这是我点击图片时的代码。 (它所做的就是将所选属性更改为true / false,并显示/隐藏所选项目的GridSelected:
private void Button_SourceZone_Select_Click(object sender,RoutedEventArgs e) { var media = ((Button)sender).DataContext; if (media.GetType() == typeof(PictureItemWeb)) { int index = selectedSourceZone.IndexOf(((PictureItemWeb)((Button)sender).DataContext)); if (index != -1) { ((PictureItemWeb)selectedSourceZone.ElementAt(index)).selected = !((PictureItemWeb)selectedSourceZone.ElementAt(index)).selected; } var g = ((Button)sender).FindName("GridSelected"); if (((PictureItemWeb)selectedSourceZone.ElementAt(index)).selected) { ((Grid)g).Visibility = System.Windows.Visibility.Visible; } else { ((Grid)g).Visibility = System.Windows.Visibility.Collapsed; } } else if (media.GetType() == typeof(VideoItem)) { int index = selectedSourceZone.IndexOf(((VideoItem)((Button)sender).DataContext)); if (index != -1) { ((VideoItem)selectedSourceZone.ElementAt(index)).Selected = (((VideoItem)selectedSourceZone.ElementAt(index)).Selected == 0.0) ? 1.0 : 0.0; } var g = ((Button)sender).FindName("GridSelected"); if (((VideoItem)selectedSourceZone.ElementAt(index)).Selected == 1.0) { ((Grid)g).Visibility = System.Windows.Visibility.Visible; } else { ((Grid)g).Visibility = System.Windows.Visibility.Collapsed; } } }
我没有发布的唯一的事情是当我点击确认select时的function..它所做的就是将媒体的ID添加到列表中,如:
selectedSourceMedias.Add(((PictureItemWeb)item).idMedia.ToString());
然后closurespopup窗口并将longlistselector设置为null。
所以当我点击一个button来再次显示列表。 它重新创build了整个列表! 如我发布的第一个代码所示(它请求媒体,将longlistselector再次设置为null,并重新创buildlonglist项目(哪一个PictureWeb和VideoItem都是Idisposable)。
最后! 这是让我发疯的原因。 我已经debugging过,它应该是完美的工作! 但是情况是这样的:
我第一次发现,所有媒体都没有选中。 那很好。 (ValueConverter首次在这里激活)
然后,如果我closures并再次打开,它们将被重新创build,并且仍然全部被取消选中(GridSelected全部被折叠)(但是现在,ValueConverter未被激活)
现在我select前3个媒体,我点击的3 UI元素的GridSelected被更改为可见,然后我确认select。 (我debugging,正确的ID保存在selectedSourceMedias)
然后我点击再次打开列表。 (所有东西都被重新创build,并在// * 1之前将ItemsSource设置为新创build的selectedSourceZone,并且不调用ValueConverted)
在// * 1之后,我手动将所选的和UpdateSelectedStatus()设置为每一个(debugging时也select了正确的介质(第一到第三个))((Grid)g).Visibility = System .Windows.Visibility.Visible;以及在selectedSourceMedias ID列表上的所有其他选项都通过折叠行…
现在,当所有的代码运行,并返回到模拟器的顶部的3张照片(应该有GridSelected可见的那些是折叠和3张照片吃完列表的末尾显示为选定!!!是让我疯狂的错误)
还有更多! 如果我点击另一个button,加载completelly新的媒体(ValueConverted被激活,所有通过折叠(这是很好))通过它显示模拟器和前3名的照片显示为选定的!
所以我认为有一个内部的错误,使数据模板具有相同的名称(“GridSelected”)
我知道这可能会让你头疼,但是请尽量帮助我!
让我知道你是否有类似的问题,以及你如何解决这个问题。
谢谢大家!!!
好吧,我找到了解决我的问题…如果你有任何人发现自己的这个问题…请注意,有一个错误,在某些地方没有清理它的缓存或什么…解决方案是我只是在设置SourceZoneselect.ItemsSource之前添加这些行:
SourceZoneselect.ClearValue(LongListSelector.ItemTemplateProperty); SourceZoneselect.ItemTemplate = null; SourceZoneselect.ItemTemplate = this.Resources["DataTemplateContentZone"] as DataTemplate;
所以如果你想每次运行转换器,都需要手动清除模板并重新应用
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。