如何在Silverlight中的Canvas上“伪造”鼠标单击事件?

时间:2010-11-12 12:05:16

标签: c# silverlight

基本上我为Silverlight创建了一个“Adorner”类,允许用户移动,缩放和旋转它所装饰的任何对象。其工作方式是Adorner监视其子元素上的任何鼠标事件,并做出相应的响应。

这对于椭圆和矩形等简单元素非常有用。但是我有一个自定义元素,其中包含一个图像和一个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>

2 个答案:

答案 0 :(得分:2)

您无法将鼠标事件自动化为元素,因为这会打开安全漏洞(请记住,您只能通过实际鼠标点击调用某些操作,例如文件打开对话框,因此它们不允许模拟点击)。

您的示例仅适用于图像,因为画布实际位于图像下方。

仅当画布范围直接位于鼠标下方时,鼠标事件才会传播到画布(例如,如果使画布更小,则图像点击将停止传播到画布)。

如果你增加画布的大小(例如包含标签的所有可能位置),它将获得事件,但如果你在一个页面上有多个BoreholeElements,你将有重叠的画布对象(这显然是坏的)。

您可能需要重新设计解决问题的方法。也许是一个包含所有子对象的大画布?

答案 1 :(得分:0)

您是否可以构建相关的EventArgs对象,然后调用OnClick方法直接传递EventArgs