Добавление поля выбора в ItemsControl? - PullRequest
0 голосов
/ 26 мая 2010

У меня есть WPF ItemsControl с Canvas ItemPanel. Рисуя из внутреннего источника, он отображает множество автоматически сгенерированных прямоугольников.

На данный момент это выглядит так:

<Window    
// .. NameSpaces
  >
  <Window.Resources>
    <DataTemplate x:Key="binTemplate">
      <Rectangle x:Name="Rect" VerticalAlignment="Bottom"
                 Canvas.Left="10" StrokeThickness="0">
        // .. Databinding Height, Width, etc
      </Rectangle>
    </DataTemplate>
  </Window.Resources>
  <DockPanel x:Name="LayoutRoot" LastChildFill="True">
      <ItemsControl
          ItemsSource="{Binding Bins}"
          ItemTemplate="{StaticResource binTemplate}">
        <ItemsControl.ItemsPanel>
          <ItemsPanelTemplate>
            <Canvas MouseDown="Canvas_MouseDown" MouseMove="Canvas_MouseMove" MouseUp="Canvas_MouseUp">
              <Rectangle x:Name="Selection" Canvas.Left="0" Canvas.Top="0" Visibility="Hidden" />
            </Canvas>
          </ItemsPanelTemplate>
        </ItemsControl.ItemsPanel>
      </ItemsControl>
  </DockPanel>
</Window>

Я сейчас тоже пытаюсь реализовать поле выбора ... ну ... выберите мои прямоугольники. знак равно Я попытался просто добавить блок в ItemsControl PanelTemplate и управлять им с помощью событий мыши Canvas, но, похоже, мне не разрешено это делать. Сообщение об ошибке: «Невозможно явно изменить коллекцию дочерних элементов Panel, которая используется как ItemsPanel для ItemsControl. ItemsControl создает дочерние элементы для Panel.»

Каков предпочтительный способ реализации такого поведения? Я думал о наложении другого холста (с использованием отрицательного поля) и рисовании там поля выделения, но это похоже на плохой взлом.

Заранее спасибо!

1 Ответ

2 голосов
/ 26 мая 2010

Вместо того, чтобы добавлять поле выбора к Canvas, вы должны добавить его как Adorner вместо Canvas. Чтобы получить AdornerLayer для Canvas, вы можете использовать метод AdornerLayer.GetAdornerLayer или обернуть Canvas в AdornerDecorator и использовать его AdornerLayer свойство.

...