css - 应用 WPF 样式,如 CSS 和 Html

标签 css wpf

我怀疑这是可能的,但只是想确认一下。

我正在编写一个简单的 WPF 应用程序并希望在外部定义我的样式,因此您基本上可以将样式作为外部资源加载。有点像 CSS 和 HTML 通常是如何分离的......

然而,让我感到困扰的一件事是,对于 HTML 和 CSS,它更多的是一种从外部观察的方法,CSS 以元素为目标并应用于匹配元素。然而,对于 WPF,它似乎是另一种方式,您必须告诉元素它应该应用什么样式,但这似乎不是很动态。所以我只想知道是否有一种方法可以应用样式,以便样式仅针对元素。

一个例子是这样的:

<Style TargetType="{x:Type TextBox}" TargetElement="{x:Name SomeTextboxElement}">
    <Setter Property="Width" Value="Auto"/>
</Style>

通常您必须为样式指定一个键,然后获取要映射到样式键的元素 (SomeTextboxElement)。

必须明确地给每个元素一个样式绑定(bind)似乎有点傻,它应该更加分层和过滤(这可能是可能的,我只是不知道如何)而不是一对一的映射。将永远为整个应用程序设置样式...

希望这是有道理的...

最佳答案

您所说的您正在寻找的内容很有趣,但不适用于 wpf 思维模式,在这种思维模式中,您将样式应用于视觉对象或视觉对象类型(意思是:您可以将样式应用于特定类型或将样式定义为具有命名键的资源并显式使用该键)。对于您的情况,我认为应该创建如下样式:

<Style TargetType="{x:Type TextBox}">
   <Setter Property="Width" Value="Auto"/>
</Style>

这会将您的样式应用于所有文本框,只需省略 TargetElement 属性即可。

我知道这并不完全相同,但是如果您想要相同的基本控件样式并根据用途进行一些更改,您可以尝试使用对其进行微小更改的触发器。我通常使用我的控件的“标记”属性为我的样式定义提供一些额外的信息。示例基本按钮样式,但有 3 个按钮:

        <Style.Triggers>
            <Trigger Property="Tag" Value="delete">
                <Setter Property="Background" Value="Red"></Setter>
            </Trigger>
            <Trigger Property="Tag" Value="confirm">
                <Setter Property="Background" Value="Green"></Setter>
            </Trigger>
        </Style.Triggers>

现在一些假设。如果满足两个条件,您想要的将非常容易实现:

  • 所有 WPF 视觉对象都有一个名为“ParentVisual”的 DependencyProperty,返回视觉对象 立即包含有问题的视觉效果。
  • 所有 WPF 视觉对象都有一个 DepencyProperty,比如“VisualType”

考虑到这一点并将其与触发器/多重触发器结合起来,您就可以为 ParentVisual.VisualType 创建触发器。

让我们为 WPF 定义一些假设的 CSS,以将样式应用于包含在 Border 内且 ID 为“subnavi”的网格包含在网格中的任何 TextBox。

Grid Border#subnavi TextBox
{
    backgroundColor:#FF0000;
}

转换为 WPF,这将是具有三个条件的 TextBox 的多重触发器:

  <MultiTrigger>
   <Condition Property="ParentVisual.VisualType" Value="Border"></Condition>
   <Condition Property="ParentVisual.Name" Value="subnavi"></Condition>
   <Condition Property="ParentVisual.ParentVisual.VisualType" Value="Grid"></Condition>
   <Setter Property="Background" Value="Red"/>
  </MultiTrigger>

但不幸的是,没有这样的 DependencyProperties,因此如果您为每个 wpf 控件创建包装器,您将只能使用我上面提到的机制。

回到我所说的 WPF 思维模式:WPF 引擎通过 WPF 引擎向上而不是向下移动可视化树来设置 WPF 元素的样式,从相关控件开始。我认为 CSS 以相反的方式工作。

编辑:我认为在我上面写的内容中使用 DependencyObject 类可能比使用 Visual 更可取。

关于css - 应用 WPF 样式,如 CSS 和 Html,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7367060/

相关文章:

CSS3 在同一元素上缩放、淡入淡出和旋转(为什么 SCALE 不起作用?!?)

javascript - 为 :hover 重新加载 CSS

.net - 为什么 FrameworkElement 的 FindResource() 方法接受对象而不是字符串?

wpf - 需要帮助在 Telerik RadControls 和 DevExpress DXperience (WPF) 之间做出决定

javascript - 修复 Firefox 文件选择窗口在所有其他窗口后面打开的问题

CSS 类选择器通配符

c# - 在 ICommand 上实现 INotifyPropertyChanged

c# - 在私有(private)委托(delegate)方法中测试异常

wpf - 该领域有人使用过 Dispatcher.Yield 吗?

html - 程式化 JBehave 报告