Использование MouseDragElementBehavior с ItemsControl и Canvas - PullRequest
2 голосов
/ 15 июня 2011

В настоящее время у меня проблема с использованием MouseDragElementsBehavior из Blend SDK при использовании ItemsControl и Custom Canvas.Мой пользовательский холст просто добавляет или удаляет MouseDragElement из его дочерних элементов в зависимости от свойства DependencyProperty.Это работало очень хорошо, когда я вручную добавлял Предметы в дочерние элементы Canvas, но, похоже, сломалось при переходе к ItemsControl.

В настоящее время я использую следующий код ItemsControl:

<ItemsControl ItemsSource="{Binding Path=CanvasItems}">
  <ItemsControl.DataContext>
    <ViewModels:ViewModel/>
  </ItemsControl.DataContext>
  <ItemsControl.ItemsPanel>
    <ItemsPanelTemplate>
      <my:CustomCanvas Background="Black" IsEditable="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type Window}}, Path=DataContext.CanEdit}" AllowDrop="{Binding RelativeSource={RelativeSource Self}, Path=IsEditable}"  />
    </ItemsPanelTemplate>
  </ItemsControl.ItemsPanel>
</ItemsControl>

Добавление поведения перетаскивания в метод Canvas.VisualChildrenChanged не позволяет перемещать вновь созданный объект, как раньше.

Нужно ли добавлять поведение перетаскивания к чему-то другому, кроме ContentPresenter, который передается в VisualChildrenChanged, или предоставлятьособый стиль?

Ответы [ 2 ]

0 голосов
/ 11 марта 2016
<ItemsControl ItemsSource="{Binding CanvasItems}">
    <ItemsControl.ItemsPanel>
        <ItemsPanelTemplate>
            <Canvas />
        </ItemsPanelTemplate>
    </ItemsControl.ItemsPanel>
    <ItemsControl.ItemContainerStyle>
        <Style TargetType="YourControl">
            <Setter Property="Template">
                <Setter.Value>
                    <ControlTemplate TargetType="YourControl">
                        <Border>
                            <Grid>
                                <SystemWindowsInteractivity:Interaction.Behaviors>
                                    <MicrosoftExpressionInteractivityLayout:MouseDragElementBehavior />
                                </SystemWindowsInteractivity:Interaction.Behaviors>
                                <ContentPresenter />
                            </Grid>
                        </Border>
                    </ControlTemplate>
                </Setter.Value>
            </Setter>
        </Style>
    </ItemsControl.ItemContainerStyle>
</ItemsControl>
0 голосов
/ 15 июня 2011

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

Если вы хотите добавить поведение к элементам управления, созданным ItemsControl, лучший способ - добавить его через установщик в ItemsControl.ItemContainerStyle, хотя в этом случае мне было проще добавить его в ItemsControl.ItemTemplate

Что-то вроде

        <ItemsControl ItemsSource="{Binding CanvasItems}">
            <ItemsControl.ItemsPanel>
                <ItemsPanelTemplate>
                    <Canvas Background="Transparent" AllowDrop="True" />
                </ItemsPanelTemplate>
            </ItemsControl.ItemsPanel>
            <ItemsControl.ItemTemplate>
                <DataTemplate>
                    <Border BorderBrush="Green" BorderThickness="1" Background="AntiqueWhite">
                        <i:Interaction.Behaviors>
                            <ei:MouseDragElementBehavior ConstrainToParentBounds="True" DragBegun="MouseDragElementBehavior_DragBegun"/>
                        </i:Interaction.Behaviors>
                        <ContentControl Content="{Binding}" />
                    </Border>
                </DataTemplate>
            </ItemsControl.ItemTemplate>
        </ItemsControl>
...