0

同じタイプの別のカスタム コントロールによってイベントが処理されるWaypointという名前のカスタム コントロールに問題があります。

概要

これらの Waypoint カスタム コントロールを、背景としてマップを持つ別のカスタム コントロールMapUserControlに配置する作業を行っています。

ここに私が現在持っているものの写真があります

現在の地図

Waypoint カスタム コントロールの XAML は次のとおりです。

<UserControl x:Name="MyWaypointControl" x:Class="MADAssignment1.Waypoint"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable="d"
FontFamily="{StaticResource PhoneFontFamilyNormal}"
FontSize="{StaticResource PhoneFontSizeNormal}"
Foreground="{StaticResource PhoneForegroundBrush}"
d:DesignHeight="35" d:DesignWidth="35" Opacity="0.5"
         Tap="Waypoint_Tap">

<UserControl.Resources>
    <Storyboard x:Name="FadeInStoryBoard">
        <DoubleAnimation
                    Storyboard.TargetName="MyWaypointControl"
                    Storyboard.TargetProperty="Opacity"
                    From="0.0" To="0.5" Duration="0:0:0.3"
                    AutoReverse="False"/>
    </Storyboard>
</UserControl.Resources>

<Grid x:Name="LayoutRoot" Background="Transparent">
    <Ellipse x:Name="BackgroundCircle" Fill="Blue" HorizontalAlignment="Left" Height="35" Margin="0,0,0,0" Stroke="Black" VerticalAlignment="Top" Width="35"/>
    <TextBlock x:Name="NumberLabel" HorizontalAlignment="Left" TextAlignment="Center" Margin="4,6,0,0" TextWrapping="Wrap" Text="" VerticalAlignment="Top" Height="22" RenderTransformOrigin="0.211,0.467" FontSize="15" Width="26"/>
</Grid>

MapUserControl カスタム コントロールの XAML は次のとおりです。

<UserControl
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:MADAssignment1" x:Name="MapUserControl" x:Class="MADAssignment1.Map"
mc:Ignorable="d"
FontFamily="{StaticResource PhoneFontFamilyNormal}"
FontSize="{StaticResource PhoneFontSizeNormal}"
Foreground="{StaticResource PhoneForegroundBrush}"
d:DesignHeight="531" d:DesignWidth="493" SizeChanged="MapUserControl_SizeChanged">

<Grid x:Name="LayoutRoot" Background="Transparent">
    <Image x:Name="MapImage" Height="532" VerticalAlignment="Top" Source="/Assets/background image.jpg" Stretch="Fill" Loaded="MapImage_Loaded"/>
    <TextBlock x:Name="MinLongitudeLabel" HorizontalAlignment="Left" Margin="33,0,0,511" TextWrapping="Wrap" Text="" VerticalAlignment="Top" FontSize="15"/>
    <TextBlock x:Name="MiddleLongitudeLabel" HorizontalAlignment="Left" Margin="200,0,0,0" TextWrapping="Wrap" Text="" VerticalAlignment="Top" FontSize="15"/>
    <TextBlock x:Name="MaxLongitudeLabel" HorizontalAlignment="Left" Margin="382,0,0,0" TextWrapping="Wrap" Text="" VerticalAlignment="Top" FontSize="15"/>
    <TextBlock x:Name="MinLatitudeLabel" HorizontalAlignment="Left" Margin="4,21,0,0" TextWrapping="Wrap" Text="" VerticalAlignment="Top" FontSize="15"/>
    <TextBlock x:Name="MiddleLatitudeLabel" HorizontalAlignment="Left" Margin="4,250,0,0" TextWrapping="Wrap" Text="" VerticalAlignment="Top" FontSize="15"/>
    <TextBlock x:Name="MaxLatitudeLabel" HorizontalAlignment="Left" Margin="4,512,0,-1" TextWrapping="Wrap" Text="" VerticalAlignment="Top" FontSize="15"/>
</Grid>

ご覧のとおり、どちらもかなり単純です。

問題

ウェイポイントをタップしても、常に期待どおりに機能するとは限りません。

Waypoint_Tap のイベント ハンドラーは次のとおりです。

    private void Waypoint_Tap(object sender, GestureEventArgs e)
    {
        BackgroundCircle.Fill = new SolidColorBrush(Colors.Red);
    }

繰り返しますが、単純です。

問題は、イベント ハンドラーの送信者オブジェクトが、常にタップしたウェイポイントではなく、マップ上にある別のウェイポイントになることです。

問題を再現する手順は次のとおりです。

  1. Waypoint #7 をタップすると、イベント ハンドラーの送信者は Waypoint #7 ユーザー コントロールだったので、赤くなりました。
  2. ウェイポイント #2 をタップすると、イベント ハンドラーの送信者は再びウェイポイント #7 だったので、赤色になりました。
  3. ウェイポイント #2 をタップすると、ウェイポイント #7 が赤くなります。

ウェイポイントを動的に追加しているのを見て、それが問題を引き起こしている可能性があると思うので、MapUserControl ユーザー コントロールにウェイポイントを追加する方法を次に示します。

        var newWaypoint = new Waypoint(waypointNumber, latitude, longitude);
        newWaypoint.Name = "wayPoint" + waypointNumber;
        newWaypoint.Opacity = 100;
        double leftMargin = CalculateLeftMargin(longitude);
        double topMargin = CalculateTopMargin(latitude);

        newWaypoint.Margin = new Thickness(leftMargin, topMargin, 0, 0);
        LayoutRoot.Children.Add(newWaypoint);

GestureEventArgs が別のコントロールにバブリング/トンネリングしている可能性も考えていましたが、使用する RoutingStrategy のタイプが見つからないためわかりません。

MSDNが言ったように、直接のRoutingStrategyを本当に望んでいました

直接: ソース要素自体にのみ、応答としてハンドラーを呼び出す機会が与えられます。これは、Windows フォームがイベントに使用する "ルーティング" に似ています。

イベントのような Windows フォームを使用するように Waypoint を設定したと思いますが、やはり希望しかありません。

4

1 に答える 1

0

私は問題を理解しました.WPFの経験が不足しているため、それを詰め込んでいます。

ウェイポイントを作成したとき、好きなように作成しました

var newWaypoint = new Waypoint(waypointNumber, latitude, longitude);
newWaypoint.Name = "wayPoint" + waypointNumber;
newWaypoint.Opacity = 100;
double leftMargin = CalculateLeftMargin(longitude);
double topMargin = CalculateTopMargin(latitude);

newWaypoint.Margin = new Thickness(leftMargin, topMargin, 0, 0);
LayoutRoot.Children.Add(newWaypoint);

それに関する問題は、コントロールのマージンを設定していたことです。マージンを設定すると、実際にはウェイポイントが伸びていたので、ウェイポイントの上にウェイポイントがありました。

いくつかの調査の後、コントロールのマージンを設定するのではなく、WPF で UI 要素を適切に配置する方法を示した、WPF でプログラムによって要素の位置を変更するこの記事に出くわしました。

于 2013-09-11T21:39:29.707 に答える