gpt4 book ai didi

c# - Bing map 在使用自定义图钉时需要大量性能

转载 作者:行者123 更新时间:2023-11-30 17:09:24 26 4
gpt4 key购买 nike

我在使用带有自定义图钉的 Bing map 的 .NET 4 应用程序时遇到问题。缩放或移动 map 时性能非常差。我正在使用 ObservableCollection它具有与 Bing map 的数据绑定(bind)。每次 map 更改时,都会检查 map 部分中的图钉。该集合将重新填充,最后一个 NotifyCollectionChangedEvent正在被触发,这使得 map 绘制图钉。

<bingMap:MapItemsControl ItemsSource="{Binding Locations}">
<bingMap:MapItemsControl.ItemTemplate>
<DataTemplate>
<bingMap:Pushpin Location="{Binding Coordinates}" Height="Auto" Width="Auto" PositionOrigin="BottomCenter"
Template="{StaticResource PushpinControlTemplateLoc}">
</bingMap:Pushpin>
</DataTemplate>
</bingMap:MapItemsControl.ItemTemplate>
</bingMap:MapItemsControl >

我用性能分析器做了一些研究:InitializeComponent()我的自定义图钉类的方法平均需要 25% 到 35% 的时间!

map 上通常显示 10 到 25 个自定义图钉。如果我减少数据绑定(bind)的数量,它会变得更快一些,但仍然不够快。

我已经测试过将所有画笔声明为卡住的静态资源,但绘图仍然运行得很慢。

<SolidColorBrush x:Key="SolidColorBrushUnknownMsg" Color="Gray" ice:Freeze="True"  xmlns:ice="http://schemas.microsoft.com/winfx/2006/xaml/presentation/options" />

我尝试使用 Microsoft 默认图钉 <bingMap:Pushpin Location="{Binding Coordinates}"/>这要快得多。所以我的自定义图钉的使用或实现一定有问题。

这是我的其余代码:

自定义图钉类(仅自动生成的代码):

public partial class MyPushpin: System.Windows.Controls.Grid
{
public MyPushpin()
{
InitializeComponent();
}
}

自定义图钉 XAML 代码:

<Grid x:Class="Test.MyPushpin"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
mc:Ignorable="d">

<Grid.Resources>
<Style BasedOn="{StaticResource DataTextBlock}" x:Key="test1" TargetType="TextBlock">
<Setter Property="Background" Value="{StaticResource SolidColorBrushErrorMsg}"/>
<Style.Triggers>
<DataTrigger Binding="{Binding Path=TextLine1, Mode=OneWay}" Value="0">
<Setter Property="Background" Value="{StaticResource BackgroundImage}"/>
</DataTrigger>
</Style.Triggers>
</Style>
</Grid.Resources>

<Border CornerRadius="20" BorderBrush="White" Padding="7" Opacity="0.8" Width="120" Height="100" Background="{StaticResource BackgroundImage}">
<Grid >
<Grid.RowDefinitions>
<RowDefinition Height="Auto" />
<RowDefinition Height="Auto" />
<RowDefinition Height="Auto" />
<RowDefinition Height="Auto" />
<RowDefinition Height="Auto" />
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto" />
<ColumnDefinition Width="*" />
<ColumnDefinition Width="Auto" />
</Grid.ColumnDefinitions>

<TextBlock Grid.Row="0" Grid.Column="0" Text="test2" Foreground="Black" />
<TextBlock Grid.Row="0" Grid.Column="1" Text="{Binding TextLine2, StringFormat=N1,Mode=OneWay}" Style="{StaticResource DataTextBlock}" />
<TextBlock Grid.Row="0" Grid.Column="2" Text="{Binding objCurrentPower.sUnit,Mode=OneWay}" Foreground="Black" />

<!--three more lines of textblocks with data bindings -->

</Grid>
</Border>

为什么我的自定义图钉需要如此高的性能?

最佳答案

问题已解决:与其使用单独的类和 xaml 并引用它们,不如为类中的自定义图钉使用 ControlTemplate,实际上包含 Bing map :

<ControlTemplate x:Key="CutomPushpinTemplate" TargetType="bingMap:Pushpin">
<Border CornerRadius="15" BorderBrush="White" Padding="7" Opacity="0.8" Width="120" Height="90" Background="{StaticResource Bgr_enercon}">
<Grid >
<Grid.RowDefinitions>
<RowDefinition Height="16" />
<RowDefinition Height="16" />
<RowDefinition Height="16" />
<RowDefinition Height="16" />
<RowDefinition Height="16" />
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="45" />
<ColumnDefinition Width="32" />
<ColumnDefinition Width="23" />
</Grid.ColumnDefinitions>

<TextBlock Grid.Row="0" Grid.Column="0" Text="test2" Foreground="Black" />
<TextBlock Grid.Row="0" Grid.Column="1" Text="{Binding TextLine2, StringFormat=N1,Mode=OneWay}" Style="{StaticResource DataTextBlock}" />
<TextBlock Grid.Row="0" Grid.Column="2" Text="{Binding objCurrentPower.sUnit,Mode=OneWay}" Foreground="Black" />

<!--three more lines of textblocks with data bindings -->

</Grid>
</Border>
</ControlTemplate>

此模板以这种方式用于 Bing map 的所有图钉:

<bingMap:MapItemsControl ItemsSource="{Binding Locations}">
<bingMap:MapItemsControl.ItemTemplate>
<DataTemplate>
<bingMap:Pushpin Location="{Binding objCoordinates}" Height="Auto" Width="Auto" PositionOrigin="BottomCenter" Template="{StaticResource CutomPushpinTemplate}">
</bingMap:Pushpin>
</DataTemplate>
</bingMap:MapItemsControl.ItemTemplate>

这样做要快得多。性能分析器显示程序现在不会花费太多时间来实例化自定义图钉。

这是 xaml 代码,显示了它之前是如何实现的(慢):

<ControlTemplate x:Key="PushpinControlTemplateLoc" TargetType="bingMap:Pushpin" >
<Test.MyPushpin />
</ControlTemplate>

关于c# - Bing map 在使用自定义图钉时需要大量性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12969594/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com