Я создал UserControl под названием InfoBox, который действует как причудливый текстовый блок (дополнительные кнопки и т. д.). Это работает нормально. Я могу использовать его в Blend так:
<myNS:InfoBox Text="Some Text"/>
где «Текст» — это свойство зависимости:
public static readonly DependencyProperty TextProperty =
DependencyProperty.Register("Text", typeof(string), typeof(InfoBox),
new UIPropertyMetadata(null,ValueChanged));
и обрабатывается так:
private static void ValueChanged(DependencyObject dpo,
DependencyPropertyChangedEventArgs args)
{
((InfoBox)dpo).TextBlock.Text = (string)args.NewValue;
}
Когда я добавляю элемент управления в Blend, он отображается с образцом текста времени разработки, пока я не укажу Text="Something", и в этом случае "Something" волшебным образом появляется в дизайнере. Идеально!
Но теперь я хочу передать больше, чем просто текст, я хочу иметь возможность использовать всю причудливую функциональность, которую вы получаете встроенным текстовым блоком. Выполнить, курсив и т.д.
Почему следующее не работает?
<myNS:InfoBox>
<myNS:InfoBox.ReferenceBlock>
<TextBlock>
<Run Language="en-gb" Text="SampleSample"/><LineBreak/>
<Run Language="en-gb"/><LineBreak/>
<Run Language="en-gb" Text="MoreMoreMore"/>
</TextBlock>
<myNS:InfoBox.ReferenceBlock>
</myNS:InfoBox>
.
public static readonly DependencyProperty ReferenceBlockProperty =
DependencyProperty.Register("ReferenceBlock", typeof(TextBlock),
typeof(InfoBox), new UIPropertyMetadata(null, ReferenceBlockReceived));
[...]
private static void ReferenceBlockReceived(DependencyObject dpo,
DependencyPropertyChangedEventArgs args)
{
var textblock = (TextBlock)args.NewValue;
if (textblock != null)
{
((InfoBox)dpo).TextBlock.Inlines.Clear();
((InfoBox)dpo).TextBlock.Inlines.AddRange(textblock.Inlines);
}
}
TextBlock, полученный обработчиком, по какой-то причине полностью пуст. Я ценю любую помощь. Этот материал WPF жесткий!