1

現在、Window を拡張する Dialog クラス (lookless コントロール) を作成しており、XAML スタイルを使用してそのクラスに既定の ControlTemplate を割り当てています。

ダイアログ テンプレートの「ボタン」セクションを置き換え可能にしたいのですが、他に何も指定されていない場合は、既定のボタンのセットを事前に入力します。これが、クラスに呼び出される依存関係プロパティを追加した理由です。ButtonContent

(以下のDefaultButtonsXAML を参照)アプリケーションを実行すると正しくレンダリングされますが、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 デザイナーはこれをレンダリングします。

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 を適切に設定しました...変です!DialogWindowButtonContentDialog

4

1 に答える 1

1

この問題について、Microsoft Connect でバグ レポートを作成しました。MS によると、これは既知の問題であり、仕様によるものです。

この問題を報告していただきありがとうございます。これは既知の問題であり、仕様によるものです。デザイナー内で Window のデザイン インスタンスを作成できないため、独自のプロキシ タイプに置き換えます。これが、ウィンドウではなく UserControl で正しく機能する理由です。回避策は、ダイアログのコンテンツを個別に UserControl として設計することです。

于 2012-11-14T12:46:22.880 に答える