2010-11-12 83 views
0

基本上我爲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> 
+0

你能提供一些XAML例子嗎?您仍應該能夠在標籤上獲得鼠標事件(除非在其中或在父元素中禁用了命中測試)。 – 2010-11-12 12:08:27

+0

嗨,我爲我的自定義元素添加了XAML。 – 2010-11-12 12:22:37

回答

2

不能自動鼠標事件的元素,因爲這將打開一個安全漏洞(請記住,你只能調用某些操作來自實際的鼠標點擊,如文件打開對話框,因此它們不允許模擬點擊)。

您的示例工作僅用於圖像,因爲畫布在物理上位於圖像下方。

只有當畫布範圍直接位於鼠標下時(例如,如果您將畫布變得更小,圖像點擊也將停止傳播到畫布),鼠標事件纔會傳播到畫布。

如果增加畫布的大小(例如包括標籤的所有可能位置),它將獲取事件,但是如果在單個頁面上有多個BoreholeElements,則會有重疊的畫布對象(這很明顯壞)。

您可能不得不重新處理您的問題。也許一個大畫布上有所有的孩子對象?

+0

我想你可能是對的。我可能不得不硬着頭皮,想一個不同的解決方案。目前所有元素(矩形,橢圓,鑽孔元素等)確實坐在我稱爲GraphicsLayer對象的內部,它們從Canvas繼承,但提供了繪圖功能等。但是鼠標事件處理的改變是一個巨大的變化,會打破一切我們已經有了。我認爲僅僅爲了能夠移動鑽孔標籤是不值得的。使用單獨的圖像和標籤可能會更容易。但是謝謝你的解釋和建議! – 2010-11-12 16:24:24

0

您可以構建相關EventArgs對象,然後調用OnClick方法直接傳遞EventArgs

+0

嗨格雷格,不幸的是不是因爲Adorner類直接訂閱元素MouseLeftButtonDown事件才能發揮它的魔力。這允許裝飾者使用FrameworkElement的任何子類,而不是爲每個元素類型實現自定義的OnClick事件處理程序。 – 2010-11-12 12:19:41

+0

@Tom,我過去了。這是一個猜測;) – 2010-11-12 12:21:43

+0

沒關係,感謝您的嘗試! :) – 2010-11-12 12:22:54