【问题标题】:Shared definition in ResourceDictionary or CodeBehind?ResourceDictionary 或 CodeBehind 中的共享定义?
【发布时间】:2015-06-15 06:35:04
【问题描述】:

只是想知道......对于共享定义(例如颜色、画笔),将其放在资源字典(在 XAML 中)还是代码隐藏(C#)中更好?假设:这些定义的使用在 XAML 和代码隐藏中。

例如颜色定义,似乎我从互联网上阅读的每个教程都会将其放入资源字典 - <SolidColorBrush x:Key="Color1" Color="#cccccc"/>

但是,如果将其作为public static SolidColorBrush Color1 = new SolidColorBrush(#cccccc); 放入代码隐藏中并通过x:Static 扩展-{x:Static local:MyColor.Color1} 在XAML 中访问它会不会更好?

通过这种方式,我可以在 XAML 和代码隐藏中获得很好的智能感知。另外,避免后面代码中的key硬编码-SolidColorBrush Color1 = FindResource("Color1") as Style

编辑: 我的目标是:

  • 在 xaml 和代码隐藏中都有很好的智能感知
  • 统一定义以确保不会因硬编码而出现运行时错误
  • 更好的性能

这样当设计者访问 XAML 代码中的Background="{StaticResource Color1}" 时,它与代码隐藏中的TextBlock.Background = Color1; 是一样的。而且当有人要更改x:Key="Color1"时,至少会出现编译错误。

【问题讨论】:

  • 如果将它们放在 ResourceDictionary 中,将整个字典换成另一个字典并更改外观会容易得多。另外,您可以比在代码中更容易地在 xaml 中合并 ResourceDictionaries。

标签: wpf xaml resourcedictionary


【解决方案1】:

就我个人而言,我可能会将其放在资源方面,因为这样您就可以使用 blend 来直观地查看更改设计器时发生的情况。如果您的应用程序需要很长时间才能加载,这很好。

查看此内容以从后面的代码中访问资源,这样您仍然只在一个地方拥有它。 Accessing a resource via codebehind in WPF

编辑:如果您使用资源字典,它将以混合/设计模式显示,而无需启动您的应用程序。如果您的应用程序需要一些时间来加载,那么这可以节省大量修改颜色、启动、检查和停止应用程序的时间。我不能说它对性能的影响,但一般来说,如果你可以在 XAML 中做某事而不是它背后的代码,那么最好在那里做。

【讨论】:

  • 使用resourcedictionary 会产生更好的性能吗?如果我使用 Blend 进行 UI 设计,我想resourcedictionary 是要走的路。
  • 对不起,我刚刚获得了评论的能力,但我添加了一个真正作为评论的编辑。
【解决方案2】:

这真的取决于你想要完成的事情,如果你正在做一个自定义控件并想要一个可访问的属性,例如你想要一个自定义 TextBox 控件,左侧有一个标签,标签文本颜色是您想要使用 Color 属性控制的内容,您将创建一个 DependencyProperty,也可以通过 ResourceDictionary 中的 Style 进行设置。

public class CustomTextBox : TextBox
{
    // Dependency Property
    public static readonly DependencyProperty LabelForegroundProperty = 
         DependencyProperty.Register(
             "CurrentTime",
             typeof(Color),
             typeof(CustomTextBox),
             new PropertyMetadata(Colors.Black));

    // .NET Property wrapper
    public Color LabelForeground
    {
        get { return (Color)GetValue(LabelForegroundProperty); }
       set { SetValue(LabelForegroundProperty, value); }
    }

    ...
}

风格:

<Style TargetType="CustomTextBox">
    <Setter Property="LabelForeground" Value="Green" />
</Style>

即使您正在做其他事情,您仍然应该更喜欢在ResourceDictionary 中定义资源并尝试从后面的代码中尽可能少地访问它们(因为切换出ResourceDictionary 更容易)。但如果你能详细说明你到底想做什么,我可以给你一个更好的答案。

【讨论】:

  • 我想要的是在 xaml 和代码隐藏中具有智能感知,避免对键进行硬编码,并考虑性能影响。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-03-13
相关资源
最近更新 更多