引用 Windows 8.1 项目中 xaml.cs 文件中的 xaml 元素

Refer to a xaml element in xaml.cs file in Windows 8.1 project

您好,我目前正在学习 Windows 8.1 开发 Visual Studio 2015。
如何从关联的 .xaml.cs 文件.
[=24 引用 .xaml 文件中的 xaml 元素=] MainPage.xaml 文件:

<Page
x:Class="project.MainPage"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="using:project"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable="d">

        <HubSection Width="600" x:Uid="Section1Header" Header="Map">
        <DataTemplate>
            <Grid>
                <Button x:Name="mapButton" Content="Find my location"/>
            </Grid>
        </DataTemplate>
    </HubSection>
//...

主页。xaml.cs 文件:

namespace project
{
    public sealed partial class MainPage : Page
    {
        public MainPage()
        {
            this.InitializeComponent();
            mapButton.Click += mapButton_Click;
        }
}

mapButton 上我收到错误消息:名称 'mapButton' 在实际上下文中不存在。
我认为 x:Name 是一种命名方式,我可以从 .xaml.cs 文件中访问 xaml 元素。

这里的问题是您试图从生成的内容中访问按钮的名称。 mapButton 不在 Page 的范围内,但在 HubSection 的范围内。如果您想访问按钮元素,您真正需要做的是在运行时使用 VisualTreeHelper 获取按钮。

这是一个例子。

辅助函数:

internal static void FindChildren<T>(List<T> results, DependencyObject startNode) where T : DependencyObject
{
    int count = VisualTreeHelper.GetChildrenCount(startNode);
    for (int i = 0; i < count; i++)
    {
        DependencyObject current = VisualTreeHelper.GetChild(startNode, i);
        if ((current.GetType()).Equals(typeof(T)) || (current.GetType().GetTypeInfo().IsSubclassOf(typeof(T))))
        {
            T asType = (T)current;
            results.Add(asType);
        }
        FindChildren<T>(results, current);
    }
}

访问按钮:

public MainPage()
{
    this.InitializeComponent();
    Loaded += (sender, e) =>
    {
        List<Button> results = new List<Button>();
        FindChildren(results, Hub);
        var mapButton = results.Find(item => item.Name.Equals("mapButton"));
        mapButton.Click += mapButton_Click;
    };
}

private void mapButton_Click(object sender, RoutedEventArgs arg)
{
    // Do something...
}

虽然如果您真的想将命令映射到 Click,您应该考虑在 XAML 到 binding 之间进行。