3

カスタム画鋲で Bing Maps を使用する .NET 4 アプリケーションに問題があります。マップのズームや移動のパフォーマンスが非常に悪い。ObservableCollectionBing Maps へのデータ バインディングを持つを使用しています。マップが変更されるたびに、どの画鋲がマップ セクションにあるかがチェックされます。コレクションが再入力され、最後にNotifyCollectionChangedEventが起動され、マップに画鋲が描画されます。

<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% の時間が必要です。

通常、マップには 10 ~ 25 個のカスタム画鋲が表示されます。データバインディングの量を減らすと、少し速くなりますが、それでも十分ではありません。

すべてのブラシを固定された静的リソースとして宣言するテストを既に実行しましたが、描画は依然として非常に低速です。

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

<bingMap:Pushpin Location="{Binding Coordinates}"/>はるかに高速なMicrosoft の既定の画鋲を使用しようとしました。したがって、カスタム画鋲の使用または実装に何か問題があるに違いありません。

これが私のコードの残りの部分です:

カスタム画鋲クラス (自動生成コードのみ):

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>

カスタム画鋲に多くのパフォーマンスが必要なのはなぜですか?

4

1 に答える 1

2

問題解決: 個別のクラスと xaml を使用してそれらを参照する代わりにControlTemplate、実際に Bing マップを含むクラスのカスタム プッシュピンにを使用することをお勧めします。

<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 マップのすべての画鋲に次のように使用されます。

<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>
于 2012-10-22T12:39:56.730 に答える