引用 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
之间进行。
您好,我目前正在学习 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
之间进行。