В настоящее время я пишу класс Dialog (незаметный элемент управления), который расширяет Window, и назначаю ControlTemplate по умолчанию этому классу с использованием стиля XAML.
Я хочу, чтобы раздел «Кнопки» в моем шаблоне диалогового окна можно было заменить, но предварительно заполнить его набором кнопок по умолчанию, если не указано иное. Вот почему я добавил в свой класс свойство зависимости с именем ButtonContent
.
DefaultButtons
(см. XAML ниже) отображаются правильно при запуске приложения, но предварительный просмотр дизайна Visual Studio 2010 не отображает содержимое. Почему этого не происходит?
Мой класс диалога выглядит так:
public class Dialog : Window
{
public FrameworkElement ButtonContent
{
get { return (FrameworkElement)GetValue(ButtonContentProperty); }
set { SetValue(ButtonContentProperty, value); }
}
public static readonly DependencyProperty ButtonContentProperty =
DependencyProperty.Register("ButtonContent", typeof(FrameworkElement), typeof(Dialog), new UIPropertyMetadata(null));
static Dialog()
{
DefaultStyleKeyProperty.OverrideMetadata(typeof(Dialog), new FrameworkPropertyMetadata(typeof(Dialog)));
}
}
Это мой XAML:
<Style TargetType="{x:Type Dialogs:Dialog}">
<Setter Property="DataContext" Value="{Binding RelativeSource={RelativeSource Self}}"/>
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type Dialogs:Dialog}">
<StackPanel>
<ContentPresenter Content="{TemplateBinding ButtonContent}"/>
<TextBlock>This text is rendered correctly</TextBlock>
</StackPanel>
</ControlTemplate>
</Setter.Value>
</Setter>
<Setter Property="ButtonContent">
<Setter.Value>
<!-- This stuff here is not shown in VS2010's preview -->
<UniformGrid Name="DefaultButtons" Rows="1" Columns="2">
<Button>Button 1</Button>
<Button>Button 2</Button>
</UniformGrid>
</Setter.Value>
</Setter>
</Style>
Когда я запускаю приложение, оно выглядит так:
Дизайнер VS2010 отображает это:
Изменить: Как описано в комментариях, размещение указанного выше стиля в Themes \ Generic.xaml вместо моего словаря ресурсов, включенного в App.xaml, ничего не меняет.
Изменить 2: если я явно переопределю ButtonContent
по умолчанию, как это, дизайнер также ничего не покажет. Во время выполнения все работает отлично:
<Dialogs:Dialog x:Class="Dialogs.TestDialog"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:Dialogs="clr-namespace:Dialogs">
<Dialogs:Dialog.ButtonContent>
<Button>Also not shown at design time</Button>
</Dialogs:Dialog.ButtonContent>
</Dialogs:Dialog>
Изменить 3: если я добавлю свойство ButtonContent
в UserControl
вместо моего Dialog
класса, который расширяет Window
, ButtonContent
будет правильно отображаться в пользовательском элементе управления ... Кроме того, VS2010, похоже, применяет стиль, определенный выше в любое окно, а не только окна класса Dialog
, хотя я правильно установил TargetType ... странно!
Window
, или вUserControl
. - person tlind   schedule 31.10.2012