現在、Window を拡張する Dialog クラス (lookless コントロール) を作成しており、XAML スタイルを使用してそのクラスに既定の ControlTemplate を割り当てています。
ダイアログ テンプレートの「ボタン」セクションを置き換え可能にしたいのですが、他に何も指定されていない場合は、既定のボタンのセットを事前に入力します。これが、クラスに呼び出される依存関係プロパティを追加した理由です。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 デザイナーはこれをレンダリングします。
編集:コメントで説明されているように、App.xaml から含まれているリソース ディクショナリの代わりに、上記のスタイルを Themes\Generic.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
代わりにに追加すると、ユーザー コントロール内に正しく表示されます...また、VS2010 は上記で定義されたスタイルを class のウィンドウだけでなく、任意のウィンドウに適用するようですが、 TargetType を適切に設定しました...変です!Dialog
Window
ButtonContent
Dialog