2010-05-19 7 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 이벤트가 발생을 표시합니다. ElementContent은 사각형 또는 이미지를 저장하는 데 사용됩니다

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; } 
} 

: 데이터 바인딩이 작업을 진행하기 위해

나는 CanvasElement라는 개체를 만들었습니다. 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

+0

감사합니다 말콤 - 실제로이 상황에서 이벤트 처리기를 배치해야합니까? –

+0

이 ContentControl에 어떤 콘텐츠가 포함되어 있습니까? 마우스 이벤트가 이벤트를 발생시키는 컨텐트 컨트롤을 버블 링하지 않을 수도 있습니다. – AnthonyWJones

답변

0

필자는 결국 ItemsControl을 사용하여 모양 컬렉션에 바인딩하는 것이 최선의 방법이 아니라는 결론을 내 렸습니다.

DataTemplate의 컨트롤을 사용하여 모양을 저장하면 추가 복잡성이 발생합니다. 제 경우에는 주 캔버스가 있고 각 셰이프는 주 캔버스에 배치 된 자체 캔버스에 보관됩니다.

저는 이것이 이벤트의 문제를 일으키고 있으며 모양을 배치하는 것이 더 복잡하다고 생각합니다.

0

ItemsControl에 MouseLeftButtonDown 이벤트 처리기를 추가하는 것이 좋습니다. 아이들에게 일어나는 모든 사건은 그것으로 거품을 내며 거기에서 그들을 처리 할 수 ​​있습니다.

+0

ItemsControl에 처리기를 추가해도 여전히 실행되지 않습니다. 부모 Canvas (DataTemplate에있는 핸들러가 아닌)에 핸들러를두면이 작업이 실행됩니다. –

+0

캔버스에 붙잡는 것이 문제를 해결합니까? – Stephan

관련 문제