【问题标题】:Using a DataTrigger to set the properties of a ScaleTransform使用 DataTrigger 设置 ScaleTransform 的属性
【发布时间】:2011-08-18 16:01:51
【问题描述】:

这里的 XAML 尝试失败 - 我显然在使用 Style/Setter 语法做一些愚蠢的事情。我只想通过从DataTrigger 设置ScaleTransformScaleXScaleY 属性来翻转基于某些绑定的元素。 Setter.Property 显然不支持属性路径,但是我该如何解决呢?我无法设置整个RenderTransform 属性,因为ScaleXScaleY 是独立的。有什么想法吗?

<Page xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
   <StackPanel>
      <TextBlock FontSize="50" RenderTransformOrigin=".5,.5">
         <TextBlock.Style>
            <Style>
               <Style.Triggers>
                  <DataTrigger Binding="{Binding IsChecked, ElementName=FlipX}" Value="True">
                     <Setter Property="RenderTransform.ScaleX" Value="-1"/>
                  </DataTrigger>
                  <DataTrigger Binding="{Binding IsChecked, ElementName=FlipY}" Value="True">
                     <Setter Property="RenderTransform.ScaleY" Value="-1"/>
                  </DataTrigger>
               </Style.Triggers>
            </Style>
         </TextBlock.Style>
         <TextBlock.RenderTransform>
          <ScaleTransform/>
         </TextBlock.RenderTransform>
      Hello World
      </TextBlock>
      <CheckBox Name="FlipX">Flip x</CheckBox>
      <CheckBox Name="FlipY">Flip y</CheckBox>
   </StackPanel>
</Page>

【问题讨论】:

  • 将 RenderTransform 设置为 StaticResource 转换,其中 ScaleX 和 ScaleY 在您的触发器中已设置为 -1。
  • @Will 但是 ScaleX 和 ScaleY 是独立的 - 有一个复选框可以控制它们。
  • @H.B.有点,但解决方案是将 Style 应用于子属性。我做不到。
  • @TimRogers:哎呀,哎呀。那么它有点复杂。我无法回答。

标签: wpf xaml


【解决方案1】:

你可以使用:

<Style.Triggers>
    <MultiDataTrigger>
        <MultiDataTrigger.Conditions>
            <Condition Binding="{Binding IsChecked, ElementName=FlipX}" Value="True" />
            <Condition Binding="{Binding IsChecked, ElementName=FlipY}" Value="True" />
         </MultiDataTrigger.Conditions>
         <Setter Property="RenderTransform">
             <Setter.Value>
                 <ScaleTransform ScaleX="-1" ScaleY="-1" />
             </Setter.Value>
         </Setter>
    </MultiDataTrigger>
    <MultiDataTrigger>
        <MultiDataTrigger.Conditions>
            <Condition Binding="{Binding IsChecked, ElementName=FlipX}" Value="True" />
            <Condition Binding="{Binding IsChecked, ElementName=FlipY}" Value="False" />
         </MultiDataTrigger.Conditions>
         <Setter Property="RenderTransform">
             <Setter.Value>
                 <ScaleTransform ScaleX="-1" ScaleY="1" />
             </Setter.Value>
         </Setter>
    </MultiDataTrigger>
    <MultiDataTrigger>
        <MultiDataTrigger.Conditions>
            <Condition Binding="{Binding IsChecked, ElementName=FlipX}" Value="False" />
            <Condition Binding="{Binding IsChecked, ElementName=FlipY}" Value="True" />
         </MultiDataTrigger.Conditions>
         <Setter Property="RenderTransform">
             <Setter.Value>
                 <ScaleTransform ScaleX="1" ScaleY="-1" />
             </Setter.Value>
         </Setter>
    </MultiDataTrigger>
</Style.Triggers>

【讨论】:

  • 我有同样的想法,但认为它太多余了,无法实际使用。
【解决方案2】:

Setter 在元素上工作,而Transform 不是从UIElement 派生的,所以我认为您无法使用样式来做到这一点。

我会在视图模型中解决这个问题:实现布尔型​​FlipXFlipY 属性,并公开ScaleTransform 可以绑定到的ScaleXScaleY 属性。

【讨论】:

  • 这可能比使用 XAML 更简单。我最后使用了类似的解决方案,并编写了一个多值转换器,该转换器产生一个 Transform 作为最终结果。
【解决方案3】:
  • 使用动画,可以是单帧和即时。
  • 或者将这种结构的一部分封装在 ContentControl 的模板中。然后,您可以命名转换并尝试使用 Setter.TargetName 定位它。

【讨论】:

    猜你喜欢
    • 2011-01-09
    • 2015-12-07
    • 1970-01-01
    • 2011-06-15
    • 2012-01-18
    • 2014-08-21
    • 1970-01-01
    • 2013-06-18
    • 1970-01-01
    相关资源
    最近更新 更多