我有下一个MapsItemControl模板,可以在地图上显示许多图钉/项目。它被绑定到ObservableCollection,因为我希望它们被过滤以显示或隐藏不同的选项。这是Map控件中MapsItemControl的XAML代码。
<Maps:MapItemsControl x:Name="mapSpotsItems">
<Maps:MapItemsControl.ItemTemplate>
<DataTemplate>
<StackPanel x:Name="spotPin" Visibility="{Binding isVisible}"
Maps:MapControl.Location="{Binding geopoint}" Tag="{Binding ID}" ToolTipService.ToolTip="{Binding Description}"
RenderTransformOrigin="0.5,1" Tapped="spotPin_Tapped">
<StackPanel Orientation="Horizontal" Tag="{Binding ID}">
<Grid>
<!-- Karratua -->
<Rectangle Width="25" Height="25" Fill="{StaticResource DarkGreyThemeColor}" Opacity="0.5"/>
<Rectangle Width="25" Height="25" Fill="{x:Null}" Stroke="Black" StrokeThickness="0.5" />
<!-- Borobila -->
<Image Source="{Binding MainTag}" Height="20" Width="20" HorizontalAlignment="Center" VerticalAlignment="Center"/>
</Grid>
<StackPanel Background="{StaticResource DarkGrey75ThemeColor}">
<TextBlock Text="{Binding Title}" Margin="5,0" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" Width="50" MaxLines="2" TextWrapping="Wrap" TextTrimming="CharacterEllipsis" Style="{StaticResource BaseTextBlockStyle}" FontSize="11" Foreground="{StaticResource LightGreyThemeColor}" LineHeight="11"/>
</StackPanel>
</StackPanel>
<Rectangle Width="2" Height="10" Fill="Black" StrokeThickness="0" StrokeEndLineCap="Triangle" />
</StackPanel>
</DataTemplate>
</Maps:MapItemsControl.ItemTemplate>
</Maps:MapItemsControl>
这是 DataModel :
private class SpotElement
{
public int ID { get; set; }
public Visibility isVisible { get; set; }
public bool isSelected { get; set; }
public Visibility score1 { get; set; }
public Visibility score2 { get; set; }
public Visibility score3 { get; set; }
public int Rating { get; set; }
public string Title { get; set; }
public string Description { get; set; }
public double Distance { get; set; }
public Geopoint geopoint { get; set; }
public double Latitude { get; set; }
public double Longitude { get; set; }
public double Altitude { get; set; }
public DateTime[] Date { get; set; }
public globalVars.TagImageURL[] Tag { get; set; }
public string MainTag { get; set; }
public Point NormalizedAnchorPoint { get; set; }
public string grouping { get; set; }
}
private ObservableCollection<SpotElement> allSpots;
我有一些与此有关的问题。
当我更改ObservableCollection时,如isVisible值(根据过滤器中的选择显示或隐藏),这些项完全没有改变。 这是用于过滤项目可见性的代码:
/// <summary>
/// Filtratu egiten ditu erakutsi beharreko spot-ak
/// </summary>
private void FilterSpots()
{
foreach (var item in allSpots)
{
// TODO: tag-ak falta dira filtratzeko
bool visibilitySelected = true;
if (Filter.showOnlySelected)
{
visibilitySelected = (item.isSelected == true);
}
bool visibilityBool = visibilitySelected && item.Rating >= Filter.minRating;
Visibility visible = GlobalFunc.BoolToVisibility(visibilityBool);
if (visible != item.isVisible)
{
item.isVisible = visible;
}
//Debug.WriteLine(item.Title + ": Rating {0} >= {1}? " + item.isVisible, item.Rating, Filter.minRating);
}
//mapSpotsItems.ItemsSource = null;
//mapSpotsItems.ItemsSource = allSpots;
}
注释的Debug行是我用来检查ObservableCollection(allSpots)上的值是否正确的一行。 接下来的2行(mapSpotsItems.ItemsSource = null;和mapSpotsItems.ItemsSource = allSpots;)是我要过滤项目的唯一一种模式。我认为这是最糟糕的方法,但是尽管隐藏和再次显示需要时间(有时大约20秒,地图仍无法正常工作),但在测试过程中仍能正常工作。 在这里,我检查value是否为true的情况下可见性,如果为false则崩溃了。
/// <summary>
/// Booleanetik Visibility-ra itzultzen du. True bada pasatako booleana, Visible izango da; Collapsed bestela.
/// </summary>
/// <param name="testBool"></param>
/// <returns></returns>
public static Visibility BoolToVisibility(bool testBool)
{
if (testBool) return Visibility.Visible;
else return Visibility.Collapsed;
}
各项的创建(我喜欢2000-3000项)非常缓慢,并且在平移地图时会出现明显的滞后。有什么办法可以使它变得更令人愉悦和反应灵敏?
谢谢!
答案 0 :(得分:0)
当我更改ObservableCollection时,如isVisible值(要显示或隐藏过滤器中的选择,则这些项完全没有改变。
Visibility
是Enum
,但不是bool
。您需要为xaml制作BoolToVisConverter
。
public class BoolToVisConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, string language)
{
return (value is bool && (bool)value) ? Visibility.Visible : Visibility.Collapsed;
}
public object ConvertBack(object value, Type targetType, object parameter, string language)
{
return value is Visibility && (Visibility)value == Visibility.Visible;
}
}
各项的创建(我喜欢2000-3000项)非常缓慢,并且在平移地图时会出现明显的滞后移动。有什么办法可以使它变得更令人愉悦和响应?
MapItemsControl
与ListView
和GridView
不同,它不支持UI virtualization。为了提高性能,请避免一次渲染太多项目
最后一个问题,尽管我设置了RenderTransformOrigin =“ 0.5,1”,但是好像我已经设置了RenderTransformOrigin =“ 0.0,0.0”,是从左上边界渲染的。
RenderTransformOrigin
属性不用于设置AnchorPoint
。要设置正确的布局,您可以设置NormalizedAnchorPoint
。
<maps:MapItemsControl.ItemTemplate>
<DataTemplate>
<Button x:Name="mapItemButton" Click="mapItemButton_Click" Background="Transparent">
<StackPanel>
<Border Background="{ThemeResource ApplicationPageBackgroundThemeBrush}">
<TextBlock Text="{Binding DisplayName}"/>
</Border>
<Image Source="{Binding ImageSourceUri}"
maps:MapControl.NormalizedAnchorPoint="{Binding NormalizedAnchorPoint}"
maps:MapControl.Location="{Binding Location}">
<Image.Transitions>
<TransitionCollection>
<EntranceThemeTransition/>
</TransitionCollection>
</Image.Transitions>
</Image>
</StackPanel>
</Button>
</DataTemplate>
</maps:MapItemsControl.ItemTemplate>
有关更多详细信息,请参阅官方代码sample。