Как разместить относительно дочернего элемента в другом элементе управления в XAML

В приложении UWP у меня есть пользовательский элемент управления UserControl с некоторыми дочерними элементами управления (текстовые поля, метки и т. Д.). У меня есть страница, которая включает в себя этот UserControl как дочерний элемент. Теперь я хочу поместить кнопку под этим UserControl и выровнять ее по одному из дочерних текстовых полей элемента управления с помощью RelativePanel. Я не могу найти способ доступа к дочернему элементу.

Например, у меня есть пользовательский элемент управления:

<UserControl
x:Class="Sandbox.FooControl"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="using:Sandbox"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable="d"
d:DesignHeight="300"
d:DesignWidth="400">

<Grid>
    <TextBox
        x:Name="TheTextBoxIWantToAlignWith"
        x:FieldModifier="public"/>
</Grid>

И теперь я хочу, чтобы выровнять с "TheTextBoxIWantToAlignWith":

<UserControl
x:Class="Sandbox.FooParentControl"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="using:Sandbox"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable="d"
d:DesignHeight="300"
d:DesignWidth="400">

<RelativePanel>
    <local:FooControl
        x:Name="Foo"
        RelativePanel.AlignTopWithPanel="True"
        RelativePanel.AlignHorizontalCenterWithPanel="True"/>

    <Button
        RelativePanel.Below="Foo"
        RelativePanel.AlignLeftWith="Foo.TheTextBoxIWantToAlignWith"/> <!-- This doesn't work -->
</RelativePanel>

Очевидно, что это не работает ("Ошибка RelativePanel: имя" Foo.TheTextBoxIWantToAlignWith "не существует в текущем контексте."). Я старался:

  1. Установка FieldModifier на public для дочернего TextBox
  2. Предоставление TextBox как открытого свойства в коде
  3. Предоставление TextBox как DependencyProperty в коде позади

Я действительно хочу избежать выравнивания UserControl на родительской странице, потому что он может быть использован в другом месте. Есть какой-либо способ сделать это?

1 ответ

Решение

Я закончил работать над проблемой с выделенным кодом, похожим на предложение Линдси. Я подключился к событию LayoutUpdated, которое рассчитало и установило маржу. Что-то вроде этого:

    private void AlignButton()
    {
        var transform = Foo.TheTextBoxIWantToAlignWith.TransformToVisual(RootPanel);
        var textBoxRightEdge = transform .TransformPoint(new Point()).X + Foo.TheTextBoxIWantToAlignWith.ActualWidth;
        var rightMargin = RootPanel.ActualWidth - textBoxRightEdge;

        if (Math.Abs(TheButtonIWantToAlign.Margin.Right - rightMargin) >= 1)
            TheButtonIWantToAlign.Margin = new Thickness(0, 0, rightMargin, 0);
    }
Другие вопросы по тегам