События мыши не запускаются при привязке данных к Silverlight ContentControl - PullRequest
1 голос
/ 19 мая 2010

Я нахожусь в процессе создания пользовательского элемента управления Silverlight 4, содержащего холст с несколькими элементами FrameworkElements, и преобразования его для использования привязки данных.

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 используется для хранения прямоугольника или изображения. Я заполняю ObservableCollection под названием CanvasElements и назначаю 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 не запускается. Я также использовал ContentControl в ItemsControl.

Мои вопросы:

Это разумный путь?

Почему MouseLeftButtonDown не запускается?

Ответы [ 2 ]

0 голосов
/ 08 июня 2010

В конце концов я решил, что использование ItemsControl для привязки к коллекции фигур - не лучший путь вперед.

Основная причина этого заключается в том, что использование элемента управления в DataTemplate для создания фигур добавляет дополнительную сложность, в моем случае у меня есть основной холст, и каждая фигура размещалась на своем собственном холсте, размещенном на основном холсте.

Я считаю, что это вызвало проблему с событиями и усложнило позиционирование фигур.

0 голосов
/ 19 мая 2010

Вам лучше поместить обработчик события MouseLeftButtonDown в ItemsControl. Любые события, которые происходят с его детьми, будут пузыриться до этого, и вы можете справиться с ними там.

...