не может автоматически изменить размер элемента canvas на элементе customcontrol: каждый элемент использует MouseDragElementBehavior - PullRequest
1 голос
/ 09 сентября 2011

Я могу визуализировать коллекцию предметов и перемещать их с помощью мыши.У меня возникли проблемы с автоматическим изменением размера элементов canvas.Попробуйте код как есть и посмотрите, как отображаются прямоугольники и как их можно перетаскивать мышью.Обратите внимание, что они ограничены родительскими границами (400x400).Затем найдите закомментированную строку <!--<Canvas>-->, раскомментируйте ее и закомментируйте строку над ней <Canvas Height="400" Width="400">.Теперь обратите внимание, как прямоугольники отображаются правильно, но как только вы перетащите один из них, они улетят в верхний левый угол и больше не будут перемещаться!Пожалуйста, помогите!

Вам понадобятся эти пространства имен

xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity"
xmlns:ei="http://schemas.microsoft.com/expression/2010/interactions"

Полный XAML приведен ниже, поместите его на странице или в элементе управления

<Grid x:Name="LayoutRoot">

    <UserControl>

        <UserControl.Resources>
            <DataTemplate x:Key="ItemTemplateKey">
                <Canvas Height="400" Width="400">
                <!--<Canvas>-->
                    <Rectangle Height="50" Width="50" Fill="Red">
                        <i:Interaction.Behaviors>
                            <ei:MouseDragElementBehavior ConstrainToParentBounds="True"/>
                        </i:Interaction.Behaviors>
                    </Rectangle>
                </Canvas>
            </DataTemplate>
        </UserControl.Resources>

        <Grid x:Name="LayoutRoot2">
            <ItemsControl
                ItemsSource="{Binding anArrayOfThreeOrFourThingsInTheVM}"
                ItemTemplate="{StaticResource ItemTemplateKey}">
                <ItemsControl.ItemsPanel>
                    <ItemsPanelTemplate>
                        <Canvas/>
                    </ItemsPanelTemplate>
                </ItemsControl.ItemsPanel>
            </ItemsControl>
        </Grid>

    </UserControl>

</Grid>

В ВМили код, приведенный ниже, предоставляет коллекцию для источника предметов, к которой можно привязать:

    public int[] anArrayOfThreeOrFourThingsInTheVM { get { return new int[] { 1, 2, 3 }; } }

Редактировать : Милый ребенок, Иисус!В последний раз перед сном я попытался заменить холст сеткой, и все заработало!

Вот новый рабочий xaml на случай, если у кого-то еще возникнет такая же проблема:

<Grid x:Name="LayoutRoot">

    <UserControl>

        <UserControl.Resources>
            <DataTemplate x:Key="ItemTemplateKey">
                <Grid>
                    <Rectangle Height="50" Width="50" Fill="Red">
                        <i:Interaction.Behaviors>
                            <ei:MouseDragElementBehavior ConstrainToParentBounds="True"/>
                        </i:Interaction.Behaviors>
                    </Rectangle>
                </Grid>
            </DataTemplate>
        </UserControl.Resources>

        <Grid x:Name="LayoutRoot2">
            <ItemsControl
                ItemsSource="{Binding anArrayOfThreeOrFourThingsInTheVM}"
                ItemTemplate="{StaticResource ItemTemplateKey}">
                <ItemsControl.ItemsPanel>
                    <ItemsPanelTemplate>
                        <Grid/>
                    </ItemsPanelTemplate>
                </ItemsControl.ItemsPanel>
            </ItemsControl>
        </Grid>

    </UserControl>

</Grid>

1 Ответ

2 голосов
/ 18 сентября 2011

Я отредактировал мой вопрос выше с этим ответом. Поместите это здесь, чтобы ответить / закрыть вопрос.

Вот новый рабочий xaml на случай, если у кого-то есть такая же проблема:

<UserControl>

    <UserControl.Resources>
        <DataTemplate x:Key="ItemTemplateKey">
            <Grid>
                <Rectangle Height="50" Width="50" Fill="Red">
                    <i:Interaction.Behaviors>
                        <ei:MouseDragElementBehavior ConstrainToParentBounds="True"/>
                    </i:Interaction.Behaviors>
                </Rectangle>
            </Grid>
        </DataTemplate>
    </UserControl.Resources>

    <Grid x:Name="LayoutRoot2">
        <ItemsControl
            ItemsSource="{Binding anArrayOfThreeOrFourThingsInTheVM}"
            ItemTemplate="{StaticResource ItemTemplateKey}">
            <ItemsControl.ItemsPanel>
                <ItemsPanelTemplate>
                    <Grid/>
                </ItemsPanelTemplate>
            </ItemsControl.ItemsPanel>
        </ItemsControl>
    </Grid>

</UserControl>

...