【问题标题】:Cannot see controls in WPF window after applying style/template to Window将样式/模板应用到窗口后,在 WPF 窗口中看不到控件
【发布时间】:2017-06-19 21:20:49
【问题描述】:

我有一个用于我构建的应用程序 Windows 的自定义模板。它在 App.xaml 中

<Application.Resources>
        <ResourceDictionary>
            <Style x:Key="XWindow" TargetType="{x:Type Window}">
                <Setter Property="Template">
                    <Setter.Value>
                        <ControlTemplate  >
                            <Border BorderThickness="3">
                                <Border.Effect>
                                    <DropShadowEffect BlurRadius="5" Direction="270" RenderingBias="Quality" ShadowDepth="0.5" Opacity="0.8" Color="#FF00B9FF"/>
                                </Border.Effect>
                                <Grid Background="White">
                                    <local:ControlButtons Height="38" VerticalAlignment="Top" HorizontalAlignment="Right"/>
                                    <Border BorderBrush="#99007CF7" BorderThickness="1"/>
                                </Grid>
                            </Border>
                        </ControlTemplate>
                    </Setter.Value>
                </Setter>
            </Style>
        </ResourceDictionary>
    </Application.Resources>

在我的 MainWindow.xaml 中,我应用了这样的样式(并且它有效):&lt;Window [...] Style="{DynamicResource XWindow }"

所以样式被应用到窗口。但是当我在窗口中放置一个控件时,我看不到它甚至无法选择它。它在 XAML 代码中,但即使我调试它也不在窗口上。。有人知道吗?

有一个截图: XAML Problem

当我添加一个简单的按钮时,通常应该这样做:XAML Norrmal

【问题讨论】:

  • Template中应该有一个ContentPresenter,显示Window的实际Content。

标签: c# wpf xaml styles


【解决方案1】:

正如@Clemens 所指出的,您忘记将ContentPresenter 添加到您的ControlTemplate。这是显示窗口实际内容的位置。

您还应该记住将ContentPresenter 放在AdornedDecorator 中:

<Style x:Key="XWindow" TargetType="{x:Type Window}">
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type Window}">
                <Border BorderThickness="3">
                    <Border.Effect>
                        <DropShadowEffect BlurRadius="5" Direction="270" RenderingBias="Quality" ShadowDepth="0.5" Opacity="0.8" Color="#FF00B9FF"/>
                    </Border.Effect>
                    <Grid Background="White">
                        <local:ControlButtons Height="38" VerticalAlignment="Top" HorizontalAlignment="Right"/>
                        <Border BorderBrush="#99007CF7" BorderThickness="1">
                            <AdornerDecorator>
                                <ContentPresenter/>
                            </AdornerDecorator>
                        </Border>
                    </Grid>
                </Border>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

AdornedDecorator 指定 AdornerLayer 在可视化树中的位置,如 MSDN 中所述:http://msdn.microsoft.com/en-us/library/system.windows.documents.adornerdecorator.aspx。例如,如果您打算在窗口中显示任何验证错误,则您将需要一个,因为验证错误会显示在装饰层上。

编辑:您还应该设置ControlTemplateTargetType属性:

<ControlTemplate TargetType="{x:Type Window}">

【讨论】:

  • 查看我的编辑。您还应该设置 ControlTemplate 的 TargetType 属性。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-12-13
  • 1970-01-01
  • 2021-10-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多