1

我目前正在编写一个扩展 Window 的 Dialog 类(无外观控件),并使用 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 渲染


编辑:如评论中所述,将上述样式放在 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属性添加到 aUserControl而不是我的Dialog类 extends WindowButtonContent则在用户控件中正确显示...此外,VS2010 似乎将上面定义的样式应用于任何窗口,而不仅仅是 class 的那些Dialog,尽管我已经适当地设置了 TargetType ......很奇怪!

4

1 回答 1

1

我在 Microsoft Connect 上针对此问题打开了错误报告。根据 MS 的说法,这是一个已知问题,并且是设计使然:

感谢您报告此问题。这是我们的一个已知问题,并且是设计使然。我们无法在设计器中创建 Window 的设计实例,因此我们用我们自己的代理类型替换。这就是它在 UserControl 而不是在窗口中正常工作的原因。解决方法是将对话框的内容单独设计为 UserControl。

于 2012-11-14T12:46:22.880 回答