Xaml 使用负高度边距值正确垂直对齐控件

Xaml 使用负高度边距值正确垂直对齐控件,xaml,Xaml,我创建了一个基于网格的XAML页面。在网格中,我显示不需要负上边距垂直值的图像。在我的页面中,textblocks中有两个标签,如果没有使用textblocks中的负上边距值,它们将无法在网格堆栈面板中正确对齐。第一个标签textblock我必须使用Margin=“0,-35,0,0”,第二个标签textblock我必须使用Margin=“0,-650,0,0”。下面是XAML,请帮助 您的代码有两个问题: 1) 使用DockPanel时,不能破坏可视树。这意味着您停靠的控件必须是DockPa

我创建了一个基于网格的XAML页面。在网格中,我显示不需要负上边距垂直值的图像。在我的页面中,textblocks中有两个标签,如果没有使用textblocks中的负上边距值,它们将无法在网格堆栈面板中正确对齐。第一个标签textblock我必须使用Margin=“0,-35,0,0”,第二个标签textblock我必须使用Margin=“0,-650,0,0”。下面是XAML,请帮助


您的代码有两个问题:

1) 使用DockPanel时,不能破坏可视树。这意味着您停靠的控件必须是DockPanel的直接子控件。例如:

<DockPanel>
    <Image DockPanel.Dock="Left" ... />
    <Label DockPanel.Dock="Right" .../>
</DockPanel>

否则DockPanel将无法再查看/停靠它们。网格和子列/行设置也是如此

2) 您正在将每个控件包装在一个容器中。如果没有必要,它只会造成污染 视觉树,在这种情况下,破坏了您试图建立的连接

重构后,不再需要负边距:

<Window
    x:Class="MasterPage.ApplicationInfoWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:v="clr-namespace:MasterPage"
    Title="Intake 4" Height="900" Width="1000" Background="#FFD9DDE8">
    <StackPanel>
        <Border Margin="0, 0, 0, 0" BorderBrush="Black" BorderThickness="1">
            <StackPanel Height="133" VerticalAlignment="Top">
                <Image Source="Images\header.jpg" Stretch="Fill" Height="47"  />
                <DockPanel Margin="3,0,0,5">
                    <Image DockPanel.Dock="Left" Source="Images\DSPASS_logo.png" Width="324" Stretch="Fill" Height="80" />
                    <Label DockPanel.Dock="Right" FontSize="10" HorizontalContentAlignment="Right"  HorizontalAlignment="Right" VerticalAlignment="Bottom" Name="Namelabel" Width="230" FontWeight="Bold" Foreground="#1664A1" Content="Name"/>
                </DockPanel>
            </StackPanel>
        </Border>    
        <Border Margin="0, 0, 0, 0" BorderBrush="Black" BorderThickness="1">
            <DockPanel Background="White" Height="358" VerticalAlignment="Top">
                <Image DockPanel.Dock="Left" Source="Images\silhouette.jpg" VerticalAlignment="Top" HorizontalAlignment="Left" Width="320" Stretch="Fill" Height="360" />
                <Label DockPanel.Dock="Right" FontSize="35" HorizontalContentAlignment="Left" Name="Namelabel2" Width="640" FontWeight="Bold" Foreground="#1664A1" Content="Name"/>
            </DockPanel>
        </Border>
    </StackPanel>
</Window>

正如我在帖子中所说,我在XMAL中使用了负边距值来定位控件。为了防止在包含嵌套网格的StackPanel中正确使用网格,允许正确的垂直对齐

现在,为了处理水平对齐,使用以下技术将处理此问题:

<StackPanel Orientation=Vertical />
    <StackPanel Orientation=Horizontal />
        content.....
    </StackPanel>
 </StackPanel>

所容纳之物

非常感谢您的回答。我想我需要在下面添加一个网格。我要添加的是几行和几列以显示标签。基本上是一个表格,其中每行的某些列的宽度不同。您在这里建议使用网格吗?@lelizabeth我喜欢使用网格,它们往往比其他容器给您更多的控制权。在返回时,需要更多的代码将它们连接起来。在您的情况下,当列不总是那么宽时,您可以堆叠单行网格。请记住使用伪列(宽度为=“*”)填补空白。正如我所说,你的帖子很棒;但是,它们是剥猫皮的两种方法。我还认为,另一种方法是修改几个属性并添加一个新的堆栈面板。正如你所看到的,新的堆栈面板是使用属性Orientation=“Horizontal”添加的。因此,网格现在可以在不添加负边距值的情况下工作。见下文。我不知道我是否需要添加一个关于添加子表的新帖子,正如我上面提到的,但如果有人有任何想法,这将有所帮助。谢谢。@lelizabeth在XAML中给猫剥皮通常有两种以上的方法:)不过,您的示例在很多方面都有冗余代码。以顶部的网格为例,它什么也不做,因为它没有子对象。它不像你说的那样有效。没错,您的水平StackPanel提供了与我的DockPanel相同的功能。此外,所有包装图像和文本块的StackPanel都在污染您的代码。因为它们没有堆叠,所以不需要。我的示例只是一个如何将XAML剥离到骨骼的示例,这样它就可以维护和理解了。再次感谢你,但我只是在学习。你的帖子很有意义,帮助我学习。