WPF绝对定位
本文关键字:定位 WPF | 更新日期: 2023-09-27 17:50:26
可能重复:
如何将画布绑定到矩形列表
WPF中的画布使用绝对位置,对吗?我有一个sitatution,在画布上有矩形,它们的行为就像放在垂直的堆叠面板上一样。
也就是说,我在0,0处放置一个矩形,下一个在0,0,但它出现在第一个的下面。
例如,我知道这正如我所预期的那样有效,即矩形将如预期的那样重叠,
<Canvas>
<Rectangle Canvas.Top="50" Canvas.Left="50" Width="50" Height="50" Fill="AliceBlue" />
<Rectangle Canvas.Top="60" Canvas.Left="60" Width="50" Height="50" Fill="Pink" />
</Canvas>
但我的情况比这更复杂,
<Canvas Name="DrawingCanvas" Grid.Column="0" Grid.Row="0" Background="{TemplateBinding Background}" Margin="0,30,0,0">
<ItemsControl Name="LineContainer" ItemsSource="{Binding Shapes}">
<ItemsControl.Resources>
<DataTemplate DataType="{x:Type Models1:Rectangle}">
<Rectangle Width="30" Height="30" Fill="Aquamarine" Canvas.Left="{Binding X}" Canvas.Top="{Binding Y}" >
<Rectangle.LayoutTransform>
<RotateTransform Angle="{Binding Angle}"></RotateTransform>
</Rectangle.LayoutTransform>
</Rectangle>
</DataTemplate>
</ItemsControl.Resources>
</ItemsControl>
</Canvas>
我的代码中有一个items控件,它绑定到一个形状列表。这些形状绑定到像这样的对象,
public class Rectangle : IShape, INotifyPropertyChanged
{
private double angle;
public string Text { get; set; }
public double X { get; set; }
public double Y { get; set; }
public double Angle {
get
{
return angle;
}
set
{
if (angle != value)
{
angle = value;
if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs("Angle"));
}
}
}
}
public Point Position { get; set; }
public event PropertyChangedEventHandler PropertyChanged;
}
但所有形状的坐标都是0,0,但它们仍然在垂直方向上一个接一个地排列。
有什么想法吗?
我想我现在明白了。项控件本身使其行为类似于堆栈面板。有其他选择吗?
Canvas使用绝对定位是正确的。在您的示例中,您已经指定了画布中每个矩形的顶部和左侧位置,但矩形上缺少"宽度"answers"高度"属性,这就是为什么它们可能无法按您想要的方式显示。
下面的示例显示了两个重叠的矩形。
<Canvas>
<Rectangle Canvas.Top="50" Canvas.Left="50" Width="50" Height="50" Fill="AliceBlue" />
<Rectangle Canvas.Top="60" Canvas.Left="60" Width="50" Height="50" Fill="Pink" />
</Canvas>
添加ItemsControl作为Canvas的唯一子项不是您想要的。它应该是ItemsControl:的面板
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<Canvas Grid.Column="0" Grid.Row="0" Background="{TemplateBinding Background}" Margin="0,30,0,0">
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
此外,如果在DataTemplate中设置项目,附加的属性将被忽略,必须这样做:
<ItemsControl.ItemContainerStyle>
<Style TargetType="{x:Type ContentPresenter}">
<Setter Property="Canvas.Left" Value="{Binding X}"/>
<Setter Property="Canvas.Top" Value="{Binding Y}"/>
</Style>
</ItemsControl.ItemContainerStyle>