基本上我为Silverlight创建了一个“Adorner”类,它允许用户移动,缩放和旋转它所装饰的任何对象。这种方式的工作原理是Adorner监视它的子元素上的任何鼠标事件并作出相应的响应。如何在Silverlight中的Canvas上“伪造”鼠标单击事件?
这适用于椭圆和矩形等简单元素。但我有一个自定义元素,其中包含一个图像和一个标签内的画布。
我的问题是这样的。我希望用户能够独立地从图像中移动标签,但只将偏移量保持为偏移量(因此,为什么我不只是让它们分别添加图像和标签)。这意味着标签需要使用Canvas.Left和Canvas.Top属性。但是,每当我添加这些标签时,标签就变得无法点击......即当点击标签时,该元素不再识别点击,但它仍然响应用户单击图像。
我认为这与Canvas元素没有自动布局控制的方式有关。
另一种方法是使用网格并设置Margin.Top和Margin.Left,它可以工作,但不允许有负边距 - 因此标签将永远不会出现在图像的左上方这对我们的需求是不能接受的。 (这不是真的,它可以出现在左上方,但当它具有负边距时,它会停止响应鼠标事件)
因此,我想知道是否有反正我可以捕获鼠标单击事件标签(MouseLeftButtonDown)然后以某种方式假装它直接来自画布 - 我相信这会解决我的问题,但我不知道它是否可能。
如果有人有任何想法,他们将非常感谢!
编辑:这是我的自定义元素的XAML。当单击TextBlock时,该元素不会触发MouseLeftButtonDown事件,但在单击该图像时会触发该事件。
<UserControl x:Class="SitePlanViewer.Components.Visual.BoreholeElement"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<Border x:Name="Border" BorderBrush="Transparent" BorderThickness="2" Margin="-5">
<Canvas x:Name="MainCanvas" Margin="5" MinWidth="12" MinHeight="12">
<Image x:Name="BoreholeImage" Source="/Images/BoreholeSymbol.png" VerticalAlignment="Center" Width="12" Height="12" />
<TextBlock x:Name="Label" FontSize="8" Canvas.Left="40" Canvas.Top="20" />
</Canvas>
</Border>
</UserControl>
你能提供一些XAML例子吗?您仍应该能够在标签上获得鼠标事件(除非在其中或在父元素中禁用了命中测试)。 – 2010-11-12 12:08:27
嗨,我为我的自定义元素添加了XAML。 – 2010-11-12 12:22:37