自定义窗口样式未显示在设计视图中

问题描述 投票:0回答:2

我正在尝试在 VS2019 (.NET Core 3.1) 中的 WPF 应用程序中自定义窗口样式。我正在关注一个 video,目前将样式直接添加到

MainWindow.xaml
。我的任何样式都没有显示在 XAML 设计视图中(在视频中显示),但是,样式在运行时正确显示。

所有其他样式都显示正常。我四处寻找也许是我在其他地方设置的窗口样式,但我没有找到任何东西。起初,我在内部

<WindowChrome.../>
上遇到错误,提示“‘Microsoft.VisualStudio.XSurface.Wpf.Window’类型的对象无法转换为‘System.Windows.Window’类型”,但该问题似乎已解决本身。我不确定这是否相关或线索。

知道发生了什么以及如何解决它吗?或者也许是一种强制设计时风格的黑客,这样我就可以看到我在做什么?

代码:

 <Window x:Class="FirmwareUpdater.MainWindow"
         xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
         xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
         xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
         xmlns:local="clr-namespace:FirmwareUpdater"
         xmlns:vm="clr-namespace:FirmwareUpdater.ViewModels" 
         mc:Ignorable="d"
         WindowStyle="None"
         WindowStartupLocation="CenterScreen"
         x:Name="AppWindow"
         Title="Firmware Updater"
         Height="600" Width="800">
    
     <Window.Resources>
         <Style TargetType="{x:Type local:MainWindow}">
             <Setter Property="Template">
                 <Setter.Value>
                     <ControlTemplate TargetType="{x:Type Window}">
                         <Border Background="Gray" Padding="{Binding OuterMarginSize, FallbackValue=10}">
                             <Grid Background="Red">
                             </Grid>
                         </Border>
                     </ControlTemplate>
                 </Setter.Value>
             </Setter>
         </Style>
     </Window.Resources>
    
     <WindowChrome.WindowChrome>
         <WindowChrome 
             CaptionHeight="{Binding TitleHeight}"
             ResizeBorderThickness="0"
             GlassFrameThickness="0"
             CornerRadius="0"/>
     </WindowChrome.WindowChrome>
        
    
     <Grid>
         <!-- Displays pages for navigation-->
         <Frame x:Name="mainFrame" 
                MaxHeight="600" MaxWidth="800" Margin="0,0,0,0" 
                NavigationUIVisibility="Hidden" />
     </Grid>
    
 </Window>
wpf xaml
2个回答
3
投票

最近,我在关注这个教程系列,也遇到了这个问题,无论我使用哪个设计器:NetFramework 或 NetCore。 对我来说,在设计时查看更改的唯一方法是使用 Window.Resources 中的键定义 ControlTemplate 并将 Window 的模板设置为 DynamicResource:

<Window ...
        Template="{DynamicResource WindowBase}">
<Window.Resources>
        <ControlTemplate x:Key="WindowBase" TargetType="{x:Type Window}">
        </ControlTemplate>
</Window.Resources>
</Window>

我不知道这个解决方案有多可靠,但至少我不必运行我的应用程序来查看更改。

编辑

您还可以将 ControlTemplate 从 Window.Resources 移动到某个 ResourceDictionary 并将其设置为您的 Window 模板的 StaticResource。


0
投票

是的,我同意 benqbenq 所说的...唯一的缺点是您无法单击设计器上的任何项目来更改它们。它根本不适合我,然后我从 controltemplate 中移动了所有代码,并给了它一个窗口基础的 xkey,然后在主 window.xaml 中我做了

Template="{StaticResource WindowBase}"

现在我可以在设计器中看到我的所有更改。我实际上很喜欢这个,因为我的主窗口中的所有代码看起来都很糟糕。

这就是我的 window.xaml 在样式文件夹中的样子……好吧,它的开始部分是为了让东西真正显示出来

<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
                    xmlns:local="clr-namespace:Fasetto.Word">
    <ResourceDictionary.MergedDictionaries>
        <!-- Order is important -->
        <ResourceDictionary Source="Colors.xaml" />
        <ResourceDictionary Source="Fonts.xaml" />
        <ResourceDictionary Source="Texts.xaml" />
    </ResourceDictionary.MergedDictionaries>

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

然后在我的 app.xaml 中我将其添加为资源字典

<Application x:Class="Fasetto.Word.App"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:local="clr-namespace:Fasetto.Word"
             StartupUri="MainWindow.xaml">
    <Application.Resources>
        <ResourceDictionary>
            <ResourceDictionary.MergedDictionaries>
                <!-- Order is important -->
                <ResourceDictionary Source="Styles/Colors.xaml" />
                <ResourceDictionary Source="Styles/Fonts.xaml" />
                <ResourceDictionary Source="Styles/Buttons.xaml" />
                <ResourceDictionary Source="Styles/Texts.xaml" />
                <ResourceDictionary Source="Styles/Windows.xaml" />
            </ResourceDictionary.MergedDictionaries>
        </ResourceDictionary>
    </Application.Resources>
</Application>
© www.soinside.com 2019 - 2024. All rights reserved.