0

UserControlの内部から、親のメソッドを参照しようとしています。

public partial class Tab3_2Data : UserControl
{   
    public Tab3_2Data()
    {
        InitializeComponent();

        //MainPage mp = this.Ancestors().OfType<MainPage>().FirstOrDefault();
        //var x = VisualTreeHelper.GetParent(this);
        //var z = this.Parent;
        //var parent = this.Ancestors().Take(1).FirstOrDefault();
        // None of the above work.. all come back as null

        // Trying to access this method on the parent
        //ShowMessage("test", OperationStatus.Green);

これはまだ何も試していません

    // only available OOB
    //mainPage = System.Windows.Application.Current.RootVisual as MainPage;

UserControlは次のように呼び出されます:

 <!-- Tab 3_2 -->
 <controls:TabItem Header="Groups and Roles">
     <UserControls:Tab3_2Data />
 </controls:TabItem>

EDIT2:これは私がそれを機能させた方法です:

UserControlの場合:

UserControl x:Class="xyz.ClientApp.UserControls.Tab3_2Data" Loaded="Tab3_2Data_OnLoaded"

その後、コードビハインドで:

private void Tab3_2Data_OnLoaded(object sender, RoutedEventArgs e)
        {
            mp = this.Ancestors().OfType<MainPage>().FirstOrDefault();
            //mp.ShowMessage("test", OperationStatus.Green);
        }

上記のリンクで参照されているVisualTreeEnumerationヘルパークラスを使用します。

 public static class VisualTreeEnumeration
    {
        public static IEnumerable<DependencyObject> Descendents(this DependencyObject root, int depth)
        {
            int count = VisualTreeHelper.GetChildrenCount(root);
            for (int i = 0; i < count; i++)
            {
                var child = VisualTreeHelper.GetChild(root, i);
                yield return child;
                if (depth > 0)
                {
                    foreach (var descendent in Descendents(child, --depth))
                        yield return descendent;
                }
            }
        }

        public static IEnumerable<DependencyObject> Descendents(this DependencyObject root)
        {
            return Descendents(root, Int32.MaxValue);
        }

        public static IEnumerable<DependencyObject> Ancestors(this DependencyObject root)
        {
            DependencyObject current = VisualTreeHelper.GetParent(root);
            while (current != null)
            {
                yield return current;
                current = VisualTreeHelper.GetParent(current);
            }
        }
    }
4

1 に答える 1

0

親は、コントロールがロードされている場合にのみ使用可能になると思います。UserControl.Loadedイベントのハンドラーでこのロジックを実行してみることができます。さらに、コントロールはTabItemの子であるため、TabItemが表示されている場合にのみロードされます。

于 2012-12-05T17:26:34.757 に答える