【问题标题】:Adding a selection box into an ItemsControl?将选择框添加到 ItemsControl?
【发布时间】:2010-05-26 09:05:51
【问题描述】:

我有一个带有 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 的 Children 集合。ItemsControl 为 Panel 生成子元素。”

实现这种行为的首选方法是什么?我考虑过覆盖另一个画布(使用负边距)并在其中绘制选择框,但这似乎是一个糟糕的 hack。

提前致谢!

【问题讨论】:

    标签: c# wpf itemscontrol


    【解决方案1】:

    您不应将选择框添加到Canvas,而应将其添加为Adorner,而不是Canvas。要为Canvas 检索AdornerLayer,可以使用AdornerLayer.GetAdornerLayer 方法,或者将Canvas 包装在AdornerDecorator 中并使用其AdornerLayer 属性。

    【讨论】:

    • 将画布包裹在 AdornerDecorator 中不起作用,因为 ItemPanelTemplate 只接受面板,但我想我可以在后面的代码中实现它。谢谢!
    猜你喜欢
    • 2016-10-01
    • 2019-01-07
    • 1970-01-01
    • 1970-01-01
    • 2021-01-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多