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 和代码隐藏
中都有很好的智能感知
- 统一定义以确保不会因硬编码而出现运行时错误
- 更好的性能
这样当设计者在XAML代码中访问Background="{StaticResource Color1}"
时,它与代码隐藏中的TextBlock.Background = Color1;
是一样的。而且当有人要更改x:Key="Color1"
时,至少会出现编译错误。
我个人可能会把它放在资源端,因为这样您就可以使用 blend 直观地查看更改设计器时发生的情况。如果您的应用程序需要很长时间才能加载,这很好。
检查这个以从后面的代码访问资源,这样您仍然只在一个地方拥有它。
Accessing a resource via codebehind in WPF
编辑:如果您正在使用资源字典,它将以 blend/design 模式显示,而无需启动您的应用程序。如果您的应用程序需要一段时间才能加载,那么这可以节省大量修改颜色、启动、检查然后停止应用程序的时间。我不能说它对性能的影响,但一般来说,如果你可以在 XAML 中做某事而不是它背后的代码,那么最好在那里做。
这实际上取决于您要完成的任务,如果您正在做一个自定义控件并想要一个可访问的 属性,例如您想要一个带有标签的自定义 TextBox
控件左侧和标签文本颜色是您想要使用 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
).但如果你能详细说明你到底想做什么,我可以给你一个更好的答案。
只是想知道...对于共享定义(例如颜色、画笔),将其放入资源字典(在 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 和代码隐藏 中都有很好的智能感知
- 统一定义以确保不会因硬编码而出现运行时错误
- 更好的性能
这样当设计者在XAML代码中访问Background="{StaticResource Color1}"
时,它与代码隐藏中的TextBlock.Background = Color1;
是一样的。而且当有人要更改x:Key="Color1"
时,至少会出现编译错误。
我个人可能会把它放在资源端,因为这样您就可以使用 blend 直观地查看更改设计器时发生的情况。如果您的应用程序需要很长时间才能加载,这很好。
检查这个以从后面的代码访问资源,这样您仍然只在一个地方拥有它。 Accessing a resource via codebehind in WPF
编辑:如果您正在使用资源字典,它将以 blend/design 模式显示,而无需启动您的应用程序。如果您的应用程序需要一段时间才能加载,那么这可以节省大量修改颜色、启动、检查然后停止应用程序的时间。我不能说它对性能的影响,但一般来说,如果你可以在 XAML 中做某事而不是它背后的代码,那么最好在那里做。
这实际上取决于您要完成的任务,如果您正在做一个自定义控件并想要一个可访问的 属性,例如您想要一个带有标签的自定义 TextBox
控件左侧和标签文本颜色是您想要使用 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
).但如果你能详细说明你到底想做什么,我可以给你一个更好的答案。