如何访问控制HubSections在Win 8.1商店应用程序?在VisualTree中搜索不起作用
本文关键字:VisualTree 应用程序 不起作用 搜索 访问控制 HubSections Win | 更新日期: 2023-09-27 17:53:59
我正在制作一个Win8.1应用程序,主页面使用Hub。在每个HubSection有不同的控制,我需要从代码访问。HubSection的内容不是直接定义的,而是由DataTemplate定义的。因此,不能通过x:Name访问内容。
<Page ...>
<Grid>
...
<Hub ...>
<HubSection x:Name="ListSection">
<DataTemplate>
<local:MyListUserControl x:Name="ListControl"/>
</DataTemplate>
</HubSection>
<HubSection x:Name="ImageSection">
<DataTemplate>
<local:MyImageUserControl x:Name="ImageControl"/>
</DataTemplate>
</HubSection>
</Hub>
</Grid>
</Page>
void MainPage_Loaded(object sender, RoutedEventArgs e) {
// Not possible. Elements within DataTemplate cannot be accessed...
ListControl.DoSomething();
ImageControl.DoSomethingDifferent();
}
由于控件不能直接访问,我试图遍历VisualTree以手动查找控件-如回答类似问题所建议的:
MyListUserControl listControl;
MyImageUserControl imageControl;
void MainPage_Loaded(object sender, RoutedEventArgs e) {
FindControls(this);
if (listControl != null)
listControl.DoSomething();
if (imageControl != null)
imageControl.DoSomethingDifferent();
}
private void FindControls(DependencyObject parent) {
for (int i = 0; i < VisualTreeHelper.GetChildrenCount(parent); i++) {
DependencyObject child = VisualTreeHelper.GetChild(parent, i);
if (child is MyListUserControl) {
listControl = (child as MyListUserControl);
} else if (child is MyImageUserControl) {
imageControl= (child as MyImageUserControl);
}
if (listControl == null || imageControl == null)
FindControl(child);
else
break;
}
}
这也不起作用,只找到MyListUserControl。如果我记录子元素,VisualTree看起来像这样:
...
13: Windows.UI.Xaml.Controls.Grid
14: Windows.UI.Xaml.Controls.ScrollContentPresenter
15: Windows.UI.Xaml.Controls.ItemsStackPanel
16: Windows.UI.Xaml.Controls.HubSection
17: Windows.UI.Xaml.Controls.Border
18: Windows.UI.Xaml.Controls.Grid
19: Windows.UI.Xaml.Shapes.Rectangle
19: Windows.UI.Xaml.Controls.Button
20: ...
19: Windows.UI.Xaml.Controls.ContentPresenter
20: MyListUserControl
ItemsStackPanel(15)只有一个孩子,第一个HubSection与MyListUserControl在它。没有找到其他HubSection。至少这是大多数时候发生的事情。碰巧还找到了前三个部分。有时甚至可以找到所有的部分。
因此,搜索方法或XAML没有任何问题。似乎枢纽不加载所有节一次。那么,如何访问Sections中的控件呢?
您可以使用您自己的控件的Loaded事件,并且sender参数将是您正在寻找的控件。
<local:MyListUserControl x:Name="ListControl" Loaded="ListControl_Loaded"/>
然后在代码中:
private void ListControl_Loaded(object sender, RoutedEventArgs e)
{
listControl = (MyListUserControl)sender;
}
你也可以为你的ImageControl做同样的事情