gpt4 book ai didi

c# - WPF 样式不适用于运行时(但适用于设计器)

转载 作者:行者123 更新时间:2023-11-30 16:44:31 25 4
gpt4 key购买 nike

我在 WPF 窗口中有这段代码:

<Window.Resources>
<Style x:Key="MahappsStyle">
<Style.Resources>
<ResourceDictionary>
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary Source="pack://application:,,,/MahApps.Metro;component/Styles/Controls.xaml" />
<ResourceDictionary Source="pack://application:,,,/MahApps.Metro;component/Styles/Fonts.xaml" />
<ResourceDictionary Source="pack://application:,,,/MahApps.Metro;component/Styles/Colors.xaml" />
<ResourceDictionary Source="pack://application:,,,/MahApps.Metro;component/Styles/Accents/Blue.xaml" />
<ResourceDictionary Source="pack://application:,,,/MahApps.Metro;component/Styles/Accents/BaseLight.xaml" />
</ResourceDictionary.MergedDictionaries>
</ResourceDictionary>
</Style.Resources>
</Style>
</Window.Resources>

我的想法是在我的应用程序中为单个元素启用字典中的外部样式。例如,它应该通过将样式“MahappsStyle”应用于名为“HamburgerMenu”的元素来工作:

<mahapps:HamburgerMenu x:Name="hamburgerMenu" Style="{StaticResource MahappsStyle}"
DisplayMode="CompactOverlay">
</mahapps:HamburgerMenu>

但这种方法似乎只在设计器中有效,而在运行时无效。我错过了什么?有没有其他方法可以将 MergedDictionaries 设置为单个元素?

更新。 找到了执行此操作的方法。首先需要在应用中创建Mahapps.xaml,内容如下:

<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mahapps="http://metro.mahapps.com/winfx/xaml/controls"
xmlns:local="clr-namespace:Promt.Desktop">

<ResourceDictionary.MergedDictionaries >
<ResourceDictionary Source="pack://application:,,,/MahApps.Metro;component/Styles/Controls.xaml"/>
<ResourceDictionary Source="pack://application:,,,/MahApps.Metro;component/Styles/Fonts.xaml" />
<ResourceDictionary Source="pack://application:,,,/MahApps.Metro;component/Styles/Colors.xaml" />
<ResourceDictionary Source="pack://application:,,,/MahApps.Metro;component/Styles/Accents/Blue.xaml" />
<ResourceDictionary Source="pack://application:,,,/MahApps.Metro;component/Styles/Accents/BaseLight.xaml" />
</ResourceDictionary.MergedDictionaries>
</ResourceDictionary>

然后可以通过以下方式应用于单个元素:

<mahapps:HamburgerMenu>
<mahapps:HamburgerMenu.Resources>
<ResourceDictionary Source="pack://application:,,,/Promt.Desktop;component/Styles/Mahapps.xaml"/>
</mahapps:HamburgerMenu.Resources>
</mahapps:HamburgerMenu>

我真的很失望 ResourceDictionary 不能保存 x:key 属性。如果有人知道另一种方法 - 请张贴。

UPDATE2。来自 Evk 的更好解决方案(基于 Laith 回答)。

最佳答案

Laith 的答案很接近但不完全,你需要这样做:

<Window.Resources>
<ResourceDictionary>
<ResourceDictionary x:Key="MahappsResources">
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary Source="pack://application:,,,/MahApps.Metro;component/Styles/Controls.xaml" />
<ResourceDictionary Source="pack://application:,,,/MahApps.Metro;component/Styles/Fonts.xaml" />
<ResourceDictionary Source="pack://application:,,,/MahApps.Metro;component/Styles/Colors.xaml" />
<ResourceDictionary Source="pack://application:,,,/MahApps.Metro;component/Styles/Accents/Blue.xaml" />
<ResourceDictionary Source="pack://application:,,,/MahApps.Metro;component/Styles/Accents/BaseLight.xaml" />
</ResourceDictionary.MergedDictionaries>
</ResourceDictionary>
</ResourceDictionary>
</Window.Resources>

然后你确实可以按键引用:

<mahapps:HamburgerMenu Resources="{StaticResource MahappsResources}" />

您需要再添加一个 ResourceDictionary 定义,否则它会将您的 MahappsResources 视为 Window.Resources(类似于 Window .Resources = new ResourceDictionary() ...) 并在其上设置 key 确实没有任何意义。当您再添加一个 ResourceDictionary - 现在您确实是 adding 您的 MahappsResourcesWindow.Resources 字典,给定键,因此可以通过该键引用它。

关于c# - WPF 样式不适用于运行时(但适用于设计器),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43338348/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com