XAML控件是否有一个可以操作的中心?

6xfqseft  于 2023-11-14  发布在  其他
关注(0)|答案(1)|浏览(95)

我有一个XAML文件,基于Grid s,StackPanel s,.:在一行上,我有一个控件,位于StackPanel上。旁边有另一个StackPanel。旁边有一个Grid,包含另一个StackPanel和两个UserControlUC1_1UC1_2UC2_1UC2_2,...),等等,等等,.
在此下面,我有另一个UserControlOtherUC),现在我想在其他控件上对齐该控件。为了做到这一点,我需要类似于:

OtherUC.Margin.X = StackPanel1.Width + StackPanel1.Margin.X + 
                   StackPanel2.Width + StackPanel2.Margin.X + 
                   UC1_1.Width + UC1_1.Margin.X + 
                   UC1_2.Width + UC1_2.Margin.X + ...

字符串
我可能不需要添加边距和宽度,但这不是重点:重点是我需要为某些东西添加很多东西,这可能会更容易,如下所示:

OtherUC.Center.X = UC1_4.Center.X;


有没有一个XAML控件的Center属性可以很容易地设置?

irlmq6kh

irlmq6kh1#

没有Center属性可以使用。
但我想,如果你想根据其他控件的位置来居中控件,你可以使用RenderTransfrom,无论是在XAML中绑定,还是在代码背后。
为了便于解释,这里是CodeBehind中的示例。
下面是重现问题的最小UI

<Grid>
    <Grid.RowDefinitions>
        <RowDefinition/>
        <RowDefinition/>
        <RowDefinition/>
        <RowDefinition/>
    </Grid.RowDefinitions>

    <Rectangle x:Name="rect1"
               Width="10"
               HorizontalAlignment="Left"
               Fill="Red"/>
    <Rectangle x:Name="rect2"
               Grid.Row="1"
               Width="10"
               HorizontalAlignment="Left"
               Fill="Blue"/>
    <Rectangle x:Name="rect3"
               Grid.Row="2"
               Width="10"
               HorizontalAlignment="Left"
               Fill="Green"/>

    <StackPanel Grid.Row="3" Orientation="Horizontal">
        <Rectangle x:Name="stackRect1"
                   Width="50"
                   Margin="10"
                   Fill="Pink"/>

        <Rectangle x:Name="stackRect2"
                   Width="250"
                   Margin="10"
                   Fill="Pink"/>

        <Rectangle x:Name="stackRect3"
                   Width="278"
                   Margin="10"
                   Fill="Pink"/>
    </StackPanel>
</Grid>

字符串
下面是代码

public MainWindow()
{
    InitializeComponent();

    this.Loaded += MainWindow_Loaded;
}

private void MainWindow_Loaded(object sender, RoutedEventArgs e)
{
    var a = stackRect1.TranslatePoint(new Point(stackRect1.Width / 2, 0), this);
    var b = stackRect2.TranslatePoint(new Point(stackRect2.Width / 2, 0), this);
    var c = stackRect3.TranslatePoint(new Point(stackRect3.Width / 2, 0), this);

    rect1.RenderTransform = new TranslateTransform(a.X, 0);
    rect2.RenderTransform = new TranslateTransform(b.X, 0);
    rect3.RenderTransform = new TranslateTransform(c.X, 0);
}


正如你所看到的,我使用TranslatePoint来获得每个“Control”的中心,然后RenderTranform选择“Control”到该中心。

相关问题