MapsItemControl和ObservableCollection行为

时间:2019-01-14 21:18:00

标签: c# maps observablecollection uwp-xaml

我有下一个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;

我有一些与此有关的问题。

  1. 当我更改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;
    }
    
  2. 各项的创建(我喜欢2000-3000项)非常缓慢,并且在平移地图时会出现明显的滞后。有什么办法可以使它变得更令人愉悦和反应灵敏?

  3. 最后一个问题,尽管我已经设置了RenderTransformOrigin =“ 0.5,1”,但是好像我已经设置了RenderTransformOrigin =“ 0.0,0.0”,是从左上边界绘制的。 enter image description here。如果您查看图像,则该项目是从红点渲染的,而不是从蓝点渲染的,因为它应该渲染。

谢谢!

1 个答案:

答案 0 :(得分:0)

  

当我更改ObservableCollection时,如isVisible值(要显示或隐藏过滤器中的选择,则这些项完全没有改变。

VisibilityEnum,但不是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项)非常缓慢,并且在平移地图时会出现明显的滞后移动。有什么办法可以使它变得更令人愉悦和响应?

MapItemsControlListViewGridView不同,它不支持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