首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >WPF绝对定位

WPF绝对定位
EN

Stack Overflow用户
提问于 2011-04-15 02:31:27
回答 2查看 16.7K关注 0票数 6

可能重复:

How to bind a canvas to a list of rectangles

WPF中的画布使用绝对位置,对吗?我有一个坐姿,在画布上有长方形,它们的行为就像被放置在垂直的堆栈面板上一样。

也就是说,我在0,0放置一个矩形,在0,0放置下一个矩形,但是它出现在第一个矩形下面。

例如,我知道这和我所期望的一样,即矩形会像预期的那样重叠,

代码语言:javascript
复制
<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>

但我的情况比那要复杂一些,

代码语言:javascript
复制
<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控件,它绑定到一个形状列表。这些形状与像这样的物体结合在一起,

代码语言:javascript
复制
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,但它们仍然是垂直排列的。

有什么想法吗?

不过,我想我现在明白了。items控件本身正在使其行为类似于堆栈面板。有其他选择吗?

EN

回答 2

Stack Overflow用户

发布于 2011-04-15 02:38:03

画布使用绝对定位是正确的。在您的示例中,您已经指定了画布中每个矩形的顶部和左侧位置,但是您忽略了矩形上的宽度和高度属性,这就是它们可能不以您希望的方式显示的原因。

下面的示例显示了两个重叠的矩形。

代码语言:javascript
复制
<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>
票数 2
EN

Stack Overflow用户

发布于 2011-04-15 03:22:55

将ItemsControl添加为画布的唯一子元素并不是您想要的。它应该是ItemsControl的面板:

代码语言:javascript
复制
<ItemsControl.ItemsPanel>
    <ItemsPanelTemplate>
        <Canvas Grid.Column="0" Grid.Row="0" Background="{TemplateBinding Background}" Margin="0,30,0,0">
    </ItemsPanelTemplate>
</ItemsControl.ItemsPanel>

此外,如果在DataTemplate中设置附加属性,则必须这样做:

代码语言:javascript
复制
 <ItemsControl.ItemContainerStyle>
     <Style TargetType="{x:Type ContentPresenter}">
         <Setter Property="Canvas.Left" Value="{Binding X}"/>
         <Setter Property="Canvas.Top" Value="{Binding Y}"/>
     </Style>
 </ItemsControl.ItemContainerStyle>
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5671798

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档