2010-05-19 39 views
1

我正在創建一個Silverlight 4 UserControl,其中包含一個具有多個FrameworkElements的畫布並將其轉換爲使用數據綁定。當數據綁定到Silverlight ContentControl時,鼠標事件不會觸發

的XAML我的帆布面料是:

<Canvas x:Name="panelDisplay" > 
    <Rectangle Width="50" Height="50" MouseLeftButtonDown="Element_MouseLeftButtonDown" Stroke="Aqua" StrokeThickness="5" Fill="Aquamarine" Canvas.Left="450" Canvas.Top="50" x:Name="rect1" /> 
    <Image Source="../Images/3.jpg" Stretch="UniformToFill" Width="356" Height="224" MouseLeftButtonDown="Element_MouseLeftButtonDown" Canvas.Left="317" Canvas.Top="140" x:Name="image1" /> 
</Canvas> 

這顯示矩形圖像和MouseLeftButtonDown事件觸發,然後用諸如拖動和縮放操作的交易。

爲了得到這個工作有數據綁定我創建了一個名爲CanvasElement對象:

public class CanvasElement 
{ 
    public CanvasElement(int id, object elementContent, double width, double height, int left, int top) 
    { 
     Id = id; 
     ElementContent = elementContent; 
     Width = width; 
     Height = height; 
     Left = left; 
     Top = top; 
    } 

    public int Id { get; set; } 
    public object ElementContent { get; set; } 
    public double Width { get; set; } 
    public double Height { get; set; } 
    public int Left { get; set; } 
    public int Top { get; set; } 
} 

的ElementContent用於存儲矩形或圖像。我填充名爲CanvasElements的ObservableCollection並分配控件的DataContext。我已經改變了我的XAML到:

<Canvas x:Name="panelDisplay" > 
    <ItemsControl x:Name="CanvasElements" ItemsSource="{Binding Path=CanvasElements}"> 
     <ItemsControl.ItemTemplate> 
      <DataTemplate> 
       <Canvas> 
        <ContentControl Content="{Binding Path=ElementContent}" Height="{Binding Path=Height}" Width="{Binding Path=Width}" 
           Canvas.Left="{Binding Path=Left}" Canvas.Top="{Binding Path=Top}" 
           MouseLeftButtonDown="CanvasElement_MouseLeftButtonDown" /> 
       </Canvas> 
      </DataTemplate> 
     </ItemsControl.ItemTemplate> 
    </ItemsControl> 
</Canvas> 

我的元素出現,但CanvasElement_MouseLeftButtonDown不火。我也在ItemsControl中使用了ContentControl。

我的問題是:

這是明智的方式嗎?

爲什麼MouseLeftButtonDown不能觸發?

+0

嗨,MouseLeftButtonDown不會觸發,因爲您已經在ItemsControl的數據模板中定義了它。 – Malcolm 2010-05-19 10:38:08

+0

謝謝馬爾科姆 - 在這種情況下,我真的在哪裏放置事件處理程序。 – 2010-05-19 10:58:14

+0

您在ContentControl中包含哪些內容?這可能是因爲鼠標事件並沒有冒泡內容控件來觸發事件。 – AnthonyWJones 2010-05-19 11:54:26

回答

0

我最終決定使用ItemsControl綁定到一組形狀並不是最好的前進方向。

這樣做的主要原因是,通過在DataTemplate中使用控件來容納形狀會增加額外的複雜度,在我的情況下,我有一個主畫布,每個形狀都放置在自己的畫布上。

我相信這是導致事件的問題,並使其定位形狀更復雜。

0

您最好將MouseLeftButtonDown事件處理程序放在ItemsControl上。發生在孩子身上的任何事件都會觸發它,你可以在那裏處理它們。

+0

如果我在ItemsControl上放置一個處理程序,它仍然不會觸發。如果我把處理程序放在父畫布上(不是DataTemplate中的那個),它會觸發。 – 2010-05-19 14:22:07

+0

在Canvas上捕捉它可以解決您的問題嗎? – Stephan 2010-05-19 14:39:21

相關問題