【问题标题】:Bad or good idea? WPF: Apply styles in code-behind programmatically [closed]坏主意还是好主意? WPF:以编程方式在代码隐藏中应用样式[关闭]
【发布时间】:2017-06-19 19:57:19
【问题描述】:

情况

我正在开发一个(MVVM,Composite)WPF 应用程序,其中一切都应该以非常松散耦合的方式完成。

在应用样式方面,我已经有了一个不错的小解决方案:

无论是否需要特殊样式,所使用的每个控件都存在于单独的 DLL 中。

在构造函数中,每个控件都调用一个静态方法,该方法为该控件提供正确的样式。

TextBlock 的示例:

public partial class TextBlock : System.Windows.Controls.TextBlock
{
    public TextBlock()
    {
        InitializeComponent();
        //The class ResourceCreator knows, which style to deliver
        this.Style = (System.Windows.Style)ResourceCreator.FindResourceByName(
            Styles.StyleNames.TextBlock);           
    }
}

到目前为止,此程序设计还可以,因为您无需在任何地方应用样式。 ResourceCreator 类知道将哪种样式应用于此控件,当然它可以在不同样式之间切换。控件本身不知道,会应用哪种样式。

我想要什么

在 MVVM 应用程序中,经验法则是,视图的代码隐藏中根本不应该有任何逻辑。一切都发生在视图模型中。

我只想打破这条规则来应用样式。任何窗口或视图都应该在代码隐藏中具有一种方法,该方法遍历可视化树。应识别每个检测到的控件类型,然后应用适当的样式。

问题

这是一个坏主意还是好主意?是否有任何我看不到的事实反对这个想法?

【问题讨论】:

  • 当我使用 WPF 时,我经常需要查看一些自定义控件的结构。我知道在我的项目中,我可以使用ResourceDictionary 转到合并到窗口资源中的文件。在这个文件中 Ctrl+F + 给了我想要的控制风格。快速简单。使用您的方法查看控件的结构有多容易?
  • 您还可以解释一下为什么您决定放弃标准做法,即将ResourceDictionary 中定义的所有样式合并到应用程序或窗口资源中? 1) 它是松耦合的(这对你来说很重要); 2) 它不需要在每个控件中插入你的魔术字符串ResourceCreator.FindResourceByName 3) 按控件类型设置样式比使用某些字符串常量设置样式更安全 (StyleNames.TextBlock )。
  • 听起来不错,您的方法是可行的。在我们的主题更改项目中,我们使用 MahApps.Metro 库中使用的方式:每个主题都有单独的资源字典和一些更改主题的 ThemeManager
  • 你也可以有一个带有 DynamicResource 的主题用于颜色等,并通过 Code behind 更改它以用于主题目的。
  • MahApps.Metro 方法如您所描述的那样工作,通过ThemeManager.ApplyStyle 和动态资源。但是我们将此方法调用放在附加到窗口的行为中,以消除代码隐藏中的重复指令并执行一些额外的操作。至于性能我没有发现任何问题,对于我们项目中最复杂的窗口,主题切换大约需要半秒,我认为这次很好。

标签: c# wpf mvvm styles code-behind


【解决方案1】:

在 MVVM 应用程序中,经验法则是,视图的代码隐藏中根本不应该有任何逻辑。一切都发生在视图模型中。

你错了。 MVVM 并不是要从视图中消除代码。它是关于关注点的分离。在视图的代码隐藏中编写任何 与视图相关的 代码是非常好的。

样式纯粹与视图相关。任何控制视图层或与视图层交互的代码也很难用 XAML 表达或效率低下,例如复杂的动画。这类事情不应该在视图模型中实现。

所以你在这里没有违反任何 MVVM 规则 :)

您的应用程序逻辑应该在视图模型中实现,而您的业务逻辑应该在模型中实现。但是任何纯基于视图的功能都应该在视图中实现。

【讨论】:

  • 谢谢mm8。我会将其标记为有效答案。
猜你喜欢
  • 2014-02-27
  • 2011-10-26
  • 1970-01-01
  • 2011-10-21
  • 2012-11-06
  • 2011-03-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多