ResourceDictionary或CodeBehind中的共享定义?

时间:2015-04-09 18:30:30

标签: wpf xaml resourcedictionary

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

例如颜色定义,似乎我从互联网上阅读的每个教程都会将它放在resourcedictionary - <SolidColorBrush x:Key="Color1" Color="#cccccc"/>中。

但是,如果将代码置于public static SolidColorBrush Color1 = new SolidColorBrush(#cccccc);并通过x:静态扩展 - {x:Static local:MyColor.Color1}在XAML中访问它,那么它会不会更好?

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

修改 我的目标是:

  • 在xaml和codebehind中都有很好的intellisense
  • 统一定义以确保不会因硬编码而导致运行时错误
  • 更好的表现

因此,当设计人员访问XAML代码中的Background="{StaticResource Color1}"时,它与代码隐藏中的TextBlock.Background = Color1;相同。当有人要更改x:Key="Color1"时,至少会出现编译错误。

2 个答案:

答案 0 :(得分:0)

我个人可能会把它放在资源方面,因为这样你就可以使用blend来直观地看到更改设计器时发生的事情。如果您的应用程序需要很长时间才能加载,这非常有用。

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

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

答案 1 :(得分:0)

这实际上取决于您要完成的任务,如果您正在进行自定义控件并想要一个可访问的属性,比如说您想要一个自定义TextBox控件,左侧是Label,而Label文字颜色是您要使用Color属性控制的内容,您可以创建DependencyProperty,也可以通过Style中的ResourceDictionary进行设置。

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