使用DataTrigger设置ScaleTransform的属性

5
这里是一个XAML尝试失败的例子 - 我显然在Style/Setter语法方面做了一些愚蠢的事情。我只想通过设置DataTriggerScaleTransformScaleXScaleY属性,根据一些绑定来翻转元素。 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。 - user1228
@Will 但是ScaleX和ScaleY是独立的 - 有一个复选框来控制它们中的每一个。 - Tim Rogers
@TimRogers:哎呀,这有点复杂。我不能脱口而出地回答。 - user1228
@H.B. 我已经更改了问题标题。满意吗? - Tim Rogers
显示剩余3条评论
3个回答

8

您可以使用以下方法:

<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>

1
我也有同样的想法,但我认为它过于冗余而无法实际使用。 - H.B.

2

Setter在元素上工作,而Transform不是从UIElement派生的,因此我认为您将无法使用样式来完成此操作。

我会在视图模型中修复这个问题:实现布尔型FlipXFlipY属性,并公开ScaleXScaleY属性,以便ScaleTransform可以绑定到它们。


这可能比折腾XAML要简单。最终我使用了类似的解决方案,并编写了一个多值转换器,以Transform作为最终结果。 - Tim Rogers

0
  • 可以使用动画,可以是单帧和瞬间的。
  • 或者将一些结构封装在ContentControl的模板中。然后您可以命名变换,并尝试使用{{link1:Setter.TargetName}}来定位它。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接