WPF控件是否可以以其父控件为中心,但也可以仅使用xaml来尊重其同级控件的位置



我试图将模式弹出式控件相对于整个屏幕放在xaml屏幕的中心,但如果控件太大,两个控件会相交,也会让中央控件被同级控件(侧面板(推开。这在代码绑定、数据绑定、数据触发器、自定义控件和其他不太优雅的方法中是可行的,但有没有一种方法可以用xaml开箱即用地解决这个问题?

这是一个大大简化的问题,它是一个有两个矩形的窗口。橙色矩形总是200像素。绿色矩形大小可变,但永远不会超过600px。我们能让绿色矩形在屏幕上居中吗?除非它足够宽,会与橙色矩形碰撞。在这种情况下,绿色矩形布置在橙色矩形的右侧(就像堆叠板一样(?绿色和橙色的矩形可以放置在您想要的任何容器中,容器可以以任何方式嵌套。

<Window x:Class="WpfApp1.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:WpfApp1"
mc:Ignorable="d"
Title="MainWindow" Height="450" Width="800">
<Grid Width="800">
<Rectangle Width="200" Fill="Orange" HorizontalAlignment="Left" ></Rectangle>
<Rectangle Width="300" Fill="Green" HorizontalAlignment="Center"></Rectangle>
</Grid>

</Window>

没有内置的方法可以做到这一点,但这种方法很有效,而且相当简单:

<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition MinWidth="200"/>
<ColumnDefinition Width="Auto"/>
<ColumnDefinition/>
</Grid.ColumnDefinitions>
<Rectangle Width="200" Fill="Orange" HorizontalAlignment="Left" /> 
<Rectangle Grid.Column="1" Width="300" Fill="Green" HorizontalAlignment="Center"/>
</Grid>

如果你不想复制橙色矩形的宽度,你可以这样做:

<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition MinWidth="{Binding ElementName=OrangeRectangle, Path=ActualWidth}"/>
<ColumnDefinition Width="Auto"/>
<ColumnDefinition/>
</Grid.ColumnDefinitions>
<Rectangle x:Name="OrangeRectangle" Width="200" Fill="Orange" HorizontalAlignment="Left" /> 
<Rectangle Grid.Column="1" Width="300" Fill="Green" HorizontalAlignment="Center"/>
</Grid>

最新更新