Как разместить относительно дочернего элемента в другом элементе управления в 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 "не существует в текущем контексте."). Я старался:
- Установка FieldModifier на public для дочернего TextBox
- Предоставление TextBox как открытого свойства в коде
- Предоставление 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);
}