我的自定义控件名为 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>
如您所见,它们都相当简单。
问题
当我点击Waypoints时,他们并不总是按预期工作,我会说它是~50 / 50.
这是Waypoint_Tap的事件处理程序:
private void Waypoint_Tap(object sender, GestureEventArgs e)
{
BackgroundCircle.Fill = new SolidColorBrush(Colors.Red);
}
再次,简单。
问题在于事件处理程序中的发送方对象并不总是我点击的Waypoint,而是它将始终是地图上的另一个Waypoint。
以下是重现该问题的步骤。
现在看到我正在动态添加Waypoints,我认为这可能会导致问题,所以这里是我如何向MapUserControl用户控件添加Waypoint:
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
所说的RoutingStrategyDirect:只有源元素本身才有机会在响应中调用处理程序。这类似于Windows窗体用于事件的“路由”。
我相信我已经设置了Waypoint来使用Windows Forms这样的事件,但我再次希望。
答案 0 :(得分:0)
我弄明白了这个问题,而且由于缺乏WPF的经验,我感到很沮丧。
当我制作我的Waypoints时,我创建了它们
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);
问题在于我设置了控件的边距。当我设置保证金时,它实际上伸出了我的Waypoint,所以我在Waypoints上设有Waypoint。
经过一些研究后,我看到了这篇文章Changing Position of an Element Programmatically in WPF,它向我展示了如何在WPF中正确定位UI元素,而不是设置控件的边距。