将选择框添加到ItemsControl中?

时间:2010-05-26 09:05:52

标签: c# wpf itemscontrol

我有一个带有Canvas ItemPanel的WPF ItemsControl。从内部源绘制,它显示许多自动生成的矩形。

截至目前,它看起来像这样:

<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鼠标事件控制它,但似乎我不允许这样做。错误消息是“无法显式修改用作ItemsControl的ItemsPanel的Panel的子集合.ItemsControl为Panel生成子元素。”

实施此类行为的首选方式是什么?我想过覆盖另一个画布(使用负边距)并在那里绘制选择框,但这似乎是一个糟糕的黑客。

提前致谢!

1 个答案:

答案 0 :(得分:2)

您应该将Adorner添加到Canvas上,而不是将选择框添加到Canvas。要检索AdornerLayer的{​​{1}},您可以使用AdornerLayer.GetAdornerLayer方法,或将Canvas打包在AdornerDecorator中并使用其Canvas属性。