Silverlight:如何在 setter 中为样式使用绑定(或等效的解决方法)

Posted

技术标签:

【中文标题】Silverlight:如何在 setter 中为样式使用绑定(或等效的解决方法)【英文标题】:Silverlight: How to use a binding in setter for a style (or an equivalent work around) 【发布时间】:2011-06-20 04:12:52 【问题描述】:

如果回答this question 的人是对的,则您不能将绑定作为值放入Silverlight 样式的setter 中。真可惜,因为我有 4 个文本块,它们都对它们的不透明度属性使用完全相同的绑定。无论如何在某种意义上“设计”他们的 Opacity 属性,以便他们四个都指向同一个绑定?否则,我必须单独设置每个 Opacity 属性。就我而言,情况更糟——所有四个都共享其他属性绑定,这意味着每个 TextBlock 声明都非常长,但它们实际上都是相同的(即它们的属性绑定)。我知道我可以在代码隐藏中简洁地设置他们所有的共享属性绑定,但如果有的话,我想要一个 XAML 解决方案。

谢谢!

【问题讨论】:

您可以在 WPF 的样式设置器中应用绑定,所以您只询问 Silverlight 吗? 啊,我没有意识到这一点。我编辑了我的问题,专门说 Silverlight。 【参考方案1】:

这是它的完成方式。您使用ContentControl 并为其指定ControlTemplate 作为静态资源:-

<Grid.Resources>
    <ControlTemplate x:Key="CommonTextBlock" TargetType="ContentControl">
        <TextBlock Opacity="Binding SomeOpacity" Text="TemplateBinding Content" />
    </ControlTemplate>
<Grid.Resource>
<ContentControl Content="Binding SomeTextValue" Template="StaticResource CommonTextBlock" />
<ContentControl Content="Binding SomeOtherTextValue" Template="StaticResource CommonTextBlock" />

现在您可以根据需要将其他属性绑定到控件模板中。

这种方法可以扩展到Style:-

<Grid.Resources>
    <ControlTemplate x:Key="CommonTextBlock" TargetType="ContentControl">
        <TextBlock Opacity="Binding SomeOpacity" Text="TemplateBinding Content" />
    </ControlTemplate>
    <Style x:Key="CommonTextBlockStyle" TargetType="ContentControl">
       <Setter Property="Template" Value="StaticResource CommonTextBlock" />
       <Setter Property="Foreground" Value="Blue" />
    </Style>
<Grid.Resource>
<ContentControl Content="Binding SomeTextValue" Style="StaticResource CommonTextBlockStyle" />
<ContentControl Content="Binding SomeOtherTextValue" Style="StaticResource CommonTextBlockStyle" />

【讨论】:

我喜欢这背后的想法,但似乎 TextBlock 没有模板属性。是不是我做错了什么? @JoeCool:抱歉那些TextBlock 元素应该是内容控件。相应地进行了编辑。 (我知道我应该剪切'n'粘贴'n'编辑而不是再次输入代码)。 哦,我肯定在尝试这个。很酷!您是否建议将所有未绑定的属性(例如'Foreground="Blue"')单独保留在一个样式中,而不是将它们也粘贴在控件模板中?你怎么看?【参考方案2】:

在这个blog article 中查看SetterValueBindingHelper,在样式设置器中支持Binding 是announced for SL5。

【讨论】:

不幸的是,这仍然是一种“添加代码解决问题”之类的解决方案。【参考方案3】:

在 Silverlight 中:嗯……是的,你不能做绑定。在这里,我使用了一个静态资源(可能无法满足您的需求)。这是您无需在代码中进行绑定即可获得的最接近的结果。

<UserControl x:Class="SilverlightApplication1.MainPage"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    xmlns:system="clr-namespace:System;assembly=mscorlib"
    mc:Ignorable="d"
    d:DesignHeight="300" d:DesignWidth="400"
    Name="this" Tag="0.5">

  <UserControl.Resources>
    <system:Double x:Key="opacity">0.5</system:Double>
    <Style TargetType="TextBlock">
      <Setter Property="Opacity" Value="StaticResource opacity"/>
    </Style>
  </UserControl.Resources>
  <StackPanel>
    <TextBlock Text="ABC"/>
    <TextBlock Text="DEF"/>
    <TextBlock Text="GHI"/>
    <TextBlock Text="JKL"/>
  </StackPanel>
</UserControl>

编辑: 好吧,无论如何它都在 WPF 中......

在这里,在 WPF 中:

<Window x:Class="WpfApplication8.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525"
        Name="MyWindow" Tag="0.5">
  <Window.Resources>
    <Style TargetType="x:Type TextBlock">
      <Setter Property="Opacity" Value="Binding ElementName=MyWindow, Path=Tag"/>
    </Style>
  </Window.Resources>
  <StackPanel>
    <TextBlock Text="ABC"/>
    <TextBlock Text="DEF"/>
    <TextBlock Text="GHI"/>
    <TextBlock Text="JKL"/>
  </StackPanel>
</Window>

当然,您可以获得比这更多的创意。此外,根据定义样式的方式/时间/位置,有时仅在代码中执行会更容易。

【讨论】:

【参考方案4】:

几天前我遇到了完全相同的问题,并找到了以下博客文章。 http://blogs.msdn.com/b/delay/archive/2009/11/02/as-the-platform-evolves-so-do-the-workarounds-better-settervaluebindinghelper-makes-silverlight-setters-better-er.aspx

它就像一个魅力。

【讨论】:

以上是关于Silverlight:如何在 setter 中为样式使用绑定(或等效的解决方法)的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Jackson 中为特定类配置 setter 和 getter 名称约定?

如何在android中为自定义视图创建setter和getter

如何在 v-model 中为基于类的组件使用 getter 和 setter?

在 Silverlight 中实现登录和注册表单动画

如何以编程方式将 Silverlight Grid 布局 ColumnDefinition 宽度设置为“*”?

如何为 .h 中定义的属性在 .m 中为 Setter 和 Getter 自动生成 Xcode 5 代码? [复制]