NullReferenceException,自定义UserControl在ContentPresenter中引用了Control

时间:2014-04-25 13:15:34

标签: c# xaml windows-phone-7 windows-phone-8 user-controls

我创建了一个自定义UserControl (SlideControl),其中包含一个ContentPresenter(属性名称:PageContent)。在我的页面上,我使用UserControl并向PageContent添加一些Xaml 其中一个控件有一个名称(testTb)。当我在后面的代码中访问testTb时,它在编译时被识别。在运行时,我得到 NullReferenceException

我该怎么办?

这就是我所拥有的:

SlideControl.xaml:

<Canvas>
    <!-- some style here I want to use on every app page (slide in menu) -->
    <ContentPresenter Name="PageContentPresenter" />
</Canvas>

SlideControl.xaml.cs:

public object PageContent
{
   get { return PageContentPresenter.Content; }
   set { PageContentPresenter.Content = value; }
}

MainPage.xaml中:

<helpers:BasePage x:Name="SlideControl">
    <helpers:BasePage.PageContent>
        <TextBox x:Name="testTb" />
    </helpers:BasePage.PageContent>
</helpers:BasePage>

MainPage.xaml.cs中:

public MainPage() {
    InitializeComponent();
    this.testTb.Text = "test text"; // NullReferenceException!!!
}

1 个答案:

答案 0 :(得分:0)

要达到testTb,你必须

var testTb = (TextBox)PageContent.FindName("testTb");
//use testTb as you want.

这是因为testTb处于不同的范围

修改

如果您的XAML完全如下:

<helpers:BasePage.PageContent>
    <TextBox x:Name="testTb" />
</helpers:BasePage.PageContent>

那么你应该能够使用TextBox来做到这一点:

var testTb = (TextBox)PageContent;
testTb.Text = "Whatever you want to do";

修改

这是你需要的课程 MyVisualTreeHelper.cs

public static class MyVisualTreeHelper
{
    public static T FindVisualChild<T>(this FrameworkElement obj, string childName) where T : FrameworkElement
    {
        for (int i = 0; i < VisualTreeHelper.GetChildrenCount(obj); i++)
        {
            FrameworkElement child = (FrameworkElement)VisualTreeHelper.GetChild(obj, i);
            if (child != null && child is T && child.Name == childName)
                return (T)child;
            else
            {
                T childOfChild = FindVisualChild<T>(child, childName);
                if (childOfChild != null)
                    return childOfChild;
            }
        }
        return null;
    }
}

以下是您使用它的方式:

var testTb = SlideControl.PageContent.FindVisualChild<TextBlock>("testTb");

if (testTb != null)
    testTb.Text = "test2";