2014-05-01 26 views
0

假设我有一个用户控件,并在不同的页面中使用它。有可能知道我的用户控件的位置是

从代码隐藏我的userControl,是否有可能动态地知道它在哪个页面?

MyUserControl.xaml

<UserContol bla bla bla 
      bla bla bla 
      x:Name=ucbox> 
     other xml stuffs 
    </UserContol> 

第1页

 <Page x:Class="Page1" 
      xmlns:local=using:"path of userContol"> 

      <local:myuserControl  /> 
     </Page> 

第二页

<Page x:Class="Page2" 
     xmlns:local=using:"path of userContol"> 

      <local:myuserControl  /> 
    </Page> 

MyUserControl.xaml.cs

//how can i do that? 
var p = get the root of the Page1 or 2 

回答

1

假设您可以访问实际控制对象,则可以垂直遍历可视化树。或者,您可以使用WinRTXamlToolkit中包含的扩展名来执行诸如mycontrol.GetAncestors<Page>()之类的操作。

编辑*(菲利普Skakun)

如果你不希望/需要完整的工具包 - 你可以使用该位VisualTreeHelperExtensions的:

public static class VisualTreeHelperExtensions 
{ 
    public static IEnumerable<T> GetAncestorsOfType<T>(this DependencyObject start) where T : DependencyObject 
    { 
     return start.GetAncestors().OfType<T>(); 
    } 

    public static IEnumerable<DependencyObject> GetAncestors(this DependencyObject start) 
    { 
     var parent = VisualTreeHelper.GetParent(start); 

     while (parent != null) 
     { 
      yield return parent; 
      parent = VisualTreeHelper.GetParent(parent); 
     } 
    } 
} 
+0

我怎么可以垂直遍历可视化树?使用'VisualTreeHelper'我看不到任何方法可以帮助我。 – ArghArgh

+0

'VisualTreeHelper.GetParent'是你如何遍历树*,'VisualTreeHelper.GetChild'是你如何遍历*树*。 –

+0

使用'VisualTreeHelper.GetParent(ucbox)'我得到了userController xaml的根目录,我如何使用VisualTreeHelper获取page1(或page2)的根目录? – ArghArgh

0

在典型情况下,你的Page是一个Frame是在视觉树的根,所以你也可以抓住它从根开始是这样的:

var frame = Window.Current.Content as Frame; 

if (frame != null) 
{ 
    var page = frame.Content as Page; 

    if (page != null) 
    { 
     // you have found you page! 
    } 
    else 
    { 
     // the frame has not loaded a page yet - this isn't very likely to happen 
    } 
} 
else 
{ 
    // the app is either not initialized yet 
    // or you have modified the default template and Frame is not at the root. 
} 
+0

通过这种方式,您首先获得应用程序的根目录,以便下降树。这样对吗?我想要的不是这样,我想从树中提升树到使用它的页面。 – ArghArgh

+0

有什么区别?我只是将它展示为另一种选择,它不涉及行走(可能较高)的视觉树,因此可能表现更好。 –

相关问题