Ситуация:
У меня есть "панель-обертка" UserControl
, подобная этой (пространства имен и визуальные детали для краткости удалены:)
<UserControl ...>
<Grid x:Name="LayoutRoot" Background="White">
<ContentPresenter x:Name="integratedPanelContent" Margin="5" />
</Grid>
</UserControl>
Затем вКодовый код Я зарегистрировал свойство зависимости
public FrameworkElement PanelContent
{
get { return (FrameworkElement)GetValue(PanelContentProperty); }
set { SetValue(PanelContentProperty, value); }
}
public static readonly DependencyProperty PanelContentProperty =
DependencyProperty.Register("PanelContent", typeof(FrameworkElement), typeof(MyWrapperPanel),
new PropertyMetadata(null, OnPanelContentChanged));
private static void OnPanelContentChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
((MyWrapperPanel)d).OnSetContentChanged(e);
}
protected virtual void OnSetContentChanged(DependencyPropertyChangedEventArgs e)
{
if (PanelContent != null)
integratedPanelContent.Content = PanelContent;
}
Теперь я могу обернуть любой контент в свой элемент управления:
<my:MyWrapperPanel x:Name="myWrap">
<my:MyWrapperPanel.PanelContent>
<TextBlock x:Name="tbxNothing" Text="Nothing" />
</my:MyWrapperPanel.PanelContent>
</my:MyWrapperPanel>
Описание проблемы:
Всякий раз, когда я пытаюсь использовать ссылку tbxNothing в codebehind, система выдает NullReferenceException
, поскольку tbxNothing, хотя и как ссылка существует, не указывает на TextBlock, определенный в XAML, но имеет значение null
.
Возможный (но неудобный) обходной путь:
Существует обходной путь, при котором я удаляю x:Name
из TextBlock, а затем я явно определяю частный TextBlock с именем tbxNothing
.Затем в обработчике событий OnNavigatedTo
я присваиваю значение следующим образом:
tbxNothing = myWrap.PanelContent as TextBlock;
Это работает, но это неправильный способ сделать это, потому что, если контент является панелью стека, которая содержит требуемые элементы управления, яПришлось бы пройтись по дереву, чтобы найти то, что мне нужно, что крайне неудобно.
Вопрос:
Почему текстовый блок больше не виден при переносе в пользовательский элемент управления (описанный способ) и как получить его по его x: Name вкода позади?