我正在尝试在 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>
最近,我在关注这个教程系列,也遇到了这个问题,无论我使用哪个设计器: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。
是的,我同意 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>