ResourceDictionary 或 CodeBehind 中的共享定义?

Shared definition in ResourceDictionary or CodeBehind?

只是想知道...对于共享定义(例如颜色、画笔),将其放入资源字典(在 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 和代码隐藏中获得很好的智能感知。此外,避免在后面的代码中对密钥进行硬编码 - SolidColorBrush Color1 = FindResource("Color1") as Style.

编辑: 我的 objective 是:

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

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

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

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

这实际上取决于您要完成的任务,如果您正在做一个自定义控件并想要一个可访问的 属性,例如您想要一个带有标签的自定义 TextBox 控件左侧和标签文本颜色是您想要使用 Color 属性 控制的,您将创建一个 DependencyProperty,也可以通过 StyleResourceDictionary.

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).但如果你能详细说明你到底想做什么,我可以给你一个更好的答案。