我有一个带有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生成子元素。”
实施此类行为的首选方式是什么?我想过覆盖另一个画布(使用负边距)并在那里绘制选择框,但这似乎是一个糟糕的黑客。
提前致谢!
答案 0 :(得分:2)
您应该将Adorner
添加到Canvas
上,而不是将选择框添加到Canvas
。要检索AdornerLayer
的{{1}},您可以使用AdornerLayer.GetAdornerLayer
方法,或将Canvas
打包在AdornerDecorator
中并使用其Canvas
属性。