Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/261.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 绝对定位_C#_.net_Wpf_Xaml - Fatal编程技术网

C# 绝对定位

C# 绝对定位,c#,.net,wpf,xaml,C#,.net,Wpf,Xaml,可能重复: WPF中的画布使用绝对位置正确吗?我有一个场景,在画布上有矩形,它们的行为就像被放置在垂直的堆栈面板上一样 也就是说,我将一个矩形放置在0,0处,下一个矩形放置在0,0处,但它显示在第一个矩形下方 例如,我知道这与我预期的一样有效,即矩形将按预期重叠 <Canvas> <Rectangle Canvas.Top="50" Canvas.Left="50" Width="50" Height="50" Fill="AliceBlue" />

可能重复:

WPF中的画布使用绝对位置正确吗?我有一个场景,在画布上有矩形,它们的行为就像被放置在垂直的堆栈面板上一样

也就是说,我将一个矩形放置在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>
但所有形状的坐标都是0,0,但它们仍然在垂直方向上一个接一个地排列

有什么想法吗


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

画布使用绝对定位是正确的。在您的示例中,您已经指定了画布中每个矩形的顶部和左侧位置,但是缺少矩形上的宽度和高度属性,这就是为什么它们可能无法显示您想要的方式

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

<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作为画布的唯一子级不是您想要的。它应该是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>


您能澄清一下您的意思吗?你问如何使用绝对位置,但你甚至说你所拥有的是给你绝对位置。这不是你想要的吗?或者你想让它们成为彼此的相对位置?我会进一步更新这个问题。答案在这里,好的,你说得对。我的情况有点复杂。我会更新我的问题。你确实证明了它们会重叠。谢谢,但那是行不通的。什么是ContentPresenter?也许ContentPresenter需要其他功能。请在MSDN上查找它。如果它不会吃掉TargetType,省略它,我认为在没有它的情况下应该可以工作。你上面给出的这个答案不起作用。你给我的另一个问题的答案是有效的。事实上,它当然不起作用,你的设置是完全错误的。更新了答案。
<ItemsControl.ItemsPanel>
    <ItemsPanelTemplate>
        <Canvas Grid.Column="0" Grid.Row="0" Background="{TemplateBinding Background}" Margin="0,30,0,0">
    </ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
 <ItemsControl.ItemContainerStyle>
     <Style TargetType="{x:Type ContentPresenter}">
         <Setter Property="Canvas.Left" Value="{Binding X}"/>
         <Setter Property="Canvas.Top" Value="{Binding Y}"/>
     </Style>
 </ItemsControl.ItemContainerStyle>