如何在XAML中相对于另一个控件中的子元素进行定位

时间:2017-10-16 15:44:18

标签: xaml uwp uwp-xaml relativepanel

在UWP应用程序中,我有一个带有一些子控件的自定义UserControl(文本框,标签等)。我有一个包含UserControl作为子元素的页面。现在,我想在UserControl下面放置一个按钮,并使用RelativePanel将其与控件的一个子文本框对齐。我无法想出一种访问子元素的方法。

例如,我有一个自定义控件:

<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>

现在我想与“TheTextBoxIWantToAlignWith”对齐:

#include<ctype.h>
#include<stdio.h>

int main()
{
    char str[80],*p;

    printf("Enter A String\n");

    gets(str);

    p=str;

    while(*p)
        *p++=toupper(*p);

    printf("After uppercase conversion: %s\n",str);

    p=str;

    while(*p)
        *p++=tolower(*p);

    printf("After lowercase conversion: %s\n",str);


    return 0;
}

显然这不起作用(“RelativePanel错误:名称'Foo .TextBoxIWantToAlignWith'在当前上下文中不存在。”)。我试过了:

  1. 在子TextBox上将FieldModifier设置为public
  2. 在代码隐藏
  3. 中公开TextBox作为公共属性
  4. 在代码隐藏
  5. 中将TextBox公开为DependencyProperty

    我真的想避免将UserControl压平到父页面,因为它可以在其他地方重用。有没有办法做到这一点?

1 个答案:

答案 0 :(得分:1)

我最终使用隐藏代码解决了这个问题,类似于Lindsay的建议。我迷上了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);
    }