WPF将一个元素的比例绑定到另一个元素的比例

WPF将一个元素的比例绑定到另一个元素的比例,wpf,binding,Wpf,Binding,我有一个按钮,我想把scaleX和scaleY绑定到另一个元素的scaleX和scaleY,我该怎么做 棘手的是,我想将它绑定到一个元素,至少在初始化时,该元素可能没有设置ScaleTransform…理想情况下,将其设置为bindee元素始终具有ScaleTransform,但它是标识转换。然后命名ScaleTransform,并使用常用的元素对元素语法绑定到它: <TextBlock Text="One"> <TextBlock.LayoutTransform>

我有一个按钮,我想把scaleX和scaleY绑定到另一个元素的scaleX和scaleY,我该怎么做


棘手的是,我想将它绑定到一个元素,至少在初始化时,该元素可能没有设置ScaleTransform…

理想情况下,将其设置为bindee元素始终具有ScaleTransform,但它是标识转换。然后命名ScaleTransform,并使用常用的元素对元素语法绑定到它:

<TextBlock Text="One">
  <TextBlock.LayoutTransform>
    <ScaleTransform ScaleX="1"
                    ScaleY="1"
                    x:Name="s" />  <!-- Note the x:Name -->
  </TextBlock.LayoutTransform>
</TextBlock>

<TextBlock Text="Two">
  <TextBlock.LayoutTransform>
    <ScaleTransform ScaleX="{Binding ScaleX, ElementName=s}"
                    ScaleY="{Binding ScaleY, ElementName=s}" />
  </TextBlock.LayoutTransform>
</TextBlock>


如果需要专门绑定到元素,可以向下遍历属性,例如
{Binding layoututtransform.ScaleX,ElementName=someElement}
。如果源元素没有LayoutTransform或不是ScaleTransform,则此操作将不起作用,但它将报告运行时绑定错误。

理想情况下,将其设置为bindee元素始终具有ScaleTransform,但它是标识转换。然后命名ScaleTransform,并使用常用的元素对元素语法绑定到它:

<TextBlock Text="One">
  <TextBlock.LayoutTransform>
    <ScaleTransform ScaleX="1"
                    ScaleY="1"
                    x:Name="s" />  <!-- Note the x:Name -->
  </TextBlock.LayoutTransform>
</TextBlock>

<TextBlock Text="Two">
  <TextBlock.LayoutTransform>
    <ScaleTransform ScaleX="{Binding ScaleX, ElementName=s}"
                    ScaleY="{Binding ScaleY, ElementName=s}" />
  </TextBlock.LayoutTransform>
</TextBlock>


如果需要专门绑定到元素,可以向下遍历属性,例如
{Binding layoututtransform.ScaleX,ElementName=someElement}
。如果源元素没有LayoutTransform或不是ScaleTransform,则此操作将不起作用,但它将报告运行时绑定错误。

好的,谢谢!所以,为了让事情变得更复杂,我需要绑定到textblocks模板父级。。。所以我需要使用templateBinding,在这种情况下仍然有效吗?我想是的,但是您可能需要使用
{relativeSourceTemplatedParent}
而不是
{templateBinding}
,并且我非常确定您将需要使用LayoutTransform.ScaleX方法而不是ElementName方法(因为您不能同时拥有RelativeSource和ElementName)。因此,
{Binding LayoutTransform.ScaleX,RelativeSource={RelativeSource TemplatedParent}}
。顺便问一下,需要考虑的是:您是特别想要绑定一个比例,还是仅仅绑定整个转换,例如
TextBlock LayoutTransform=“{TemplateBinding LayoutTransform}”
?好问题,我认为缩放应该足够了……不过我会让你知道。我确实尝试了你刚才的建议,但我得到了绑定错误:路径错误:“对象”“MatrixTransform”上找不到ScaleX”属性。因此我将绑定表达式更改为:但这没有任何作用或出现错误:(顺便说一句,如何突出显示注释中的代码段?要突出显示注释中的代码段,请使用backtick,也称为backquote(在我的键盘上,它位于“1”键的左侧,但这可能取决于你住在哪里!).好的,谢谢!为了让事情变得更复杂,我需要绑定到textblocks模板父级…所以我需要使用templateBinding,在这种情况下仍然有效吗?我想是的,但是您可能需要使用
{RelativeSource TemplatedParent}
而不是
{templateBinding}
,我很确定您需要使用LayoutTransform.ScaleX方法而不是ElementName方法(因为您不能同时拥有RelativeSource和ElementName)。因此,
{Binding LayoutTransform.ScaleX,RelativeSource={RelativeSource TemplatedParent}
。顺便问一下,需要考虑的是:您是特别想绑定一个比例,还是只绑定整个变换,例如
TextBlock LayoutTransform=“{TemplateBinding LayoutTransform}”
?好问题,我认为缩放应该足够了……不过我会让你知道。我确实尝试了你刚才的建议,但我得到了绑定错误:路径错误:“对象”“MatrixTransform”上找不到ScaleX”属性。因此我将绑定表达式更改为:但这没有任何作用或出现错误:(顺便说一句,如何突出显示注释中的代码段?要突出显示注释中的代码段,请使用backtick,也称为backquote(在我的键盘上,它位于“1”键的左侧,但这可能取决于你住在哪里!)。