我创建了一个自定义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!!!
}
答案 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";