2010-05-19 38 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

相关问题