如何访问控制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中的控件呢?

如何访问控制HubSections在Win 8.1商店应用程序?在VisualTree中搜索不起作用

您可以使用您自己的控件的Loaded事件,并且sender参数将是您正在寻找的控件。

<local:MyListUserControl x:Name="ListControl" Loaded="ListControl_Loaded"/>

然后在代码中:

private void ListControl_Loaded(object sender, RoutedEventArgs e)
{
     listControl = (MyListUserControl)sender;
}

你也可以为你的ImageControl做同样的事情