【问题标题】:How to create a "custom property" in WPF Style using pure WPF (no code-behind)?如何使用纯 WPF(无代码隐藏)以 WPF 样式创建“自定义属性”?
【发布时间】:2011-07-25 15:06:49
【问题描述】:

乡亲

我在一个项目中从事 UI 设计工作,我们的团队选择尽可能地分离 C# 和 XAML。

我在为许多常见的小部件(按钮等)和一些用户控件创建样式时遇到了麻烦,特别是因为我不想/不知道如何/我不应该使用代码隐藏。

我想要做的是能够更改在我的 UserControls 布局树“深处”的元素的属性。

例如,假设我有一个 UserControl,它是一个 Border,其中包含一个 StackPanel,其中包含一个彩色 Ellipse 和其他东西。

我希望能够实例化此用户控件并仅更改椭圆的颜色,如下所示:

<MyUserControl Background="Gray" EllipseColor="LightGreen" />

其中“EllipseColor”是在 UserControl 中定义的一些“自定义”属性。

我在样式中尝试了DependencyProperty,但没有成功,尽管我“感觉”一定有一个简单的方法可以做到这一点。

非常欢迎任何帮助(链接、代码 sn-ps)。

感谢阅读。

【问题讨论】:

  • 我认为 DependencyProperty 正是你想要的......但当然你必须编写代码来注册它 - 这算作代码隐藏吗?您在尝试使用 DependencyProperty 时遇到了什么问题?

标签: wpf xaml styles dependency-properties


【解决方案1】:

MVVM 中的“No Code Behind”规则是为了保持 View 和 ViewModel 完全分离,并且不应用于特定于视图的代码,例如 DependencyProperties。就像说“用这些方形积木建造房子,但我想要一个圆形屋顶,你不能创造自己的积木”。 DependencyProperties 的全部意义在于为您的视图创建尚不存在的附加属性。

重要的是 View 不直接引用 ViewModel,反之亦然。

在您的情况下,我会在代码后面为您的 UserControl 为 EllipseColor 创建一个 DependencyProperty,或者使用类似 UserControl 的 Background 属性并将我的 Ellipse 填充颜色绑定到该属性。

【讨论】:

  • 感谢您的详尽解释!我实际上尝试过这样做,但是如何将 UserControl Background 属性绑定到 Ellipse 而不会 UserControl 本身变成那种颜色?如果 UserControl 背景已经设置为另一种颜色怎么办?很n00b,我知道,但是...
  • @heltonBiker 如果我知道颜色不会被使用或将被覆盖,我只会使用现有的颜色属性。例如,如果您的 UserControl 的第一个子项(边框)定义了背景颜色,它将覆盖 UserControl 的 BackgroundColor,因此可以安全地将该属性用于 Ellipse 颜色。
猜你喜欢
  • 2018-07-16
  • 1970-01-01
  • 2013-10-17
  • 2011-01-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-18
相关资源
最近更新 更多