WPF为什么我的ScaleTransform已冻结,我该如何绑定它呢?

时间:2010-02-17 00:11:57

标签: wpf data-binding scaletransform

我有一个非常简单的用户控件,我想在后面的代码中将ScaleTransform属性绑定到DP,如下所示:

<UserControl 
x:Name="RoundByRound"
DataContext="{Binding RelativeSource={RelativeSource Self}}"
...
>

<Canvas x:Name="MyCanvas">
  <Canvas.RenderTransform>
    <TransformGroup>
      <ScaleTransform ScaleX="{Binding ZoomTransform.ScaleX, ElementName=RoundByRound}" 
                      ScaleY="{Binding ZoomTransform.ScaleY, ElementName=RoundByRound}"/>
      <SkewTransform/>
      <RotateTransform/>
      <TranslateTransform X="{Binding TranslateTransform.X, ElementName=RoundByRound}" 
                          Y="{Binding TranslateTransform.Y, ElementName=RoundByRound}"/>
     </TransformGroup>
   </Canvas.RenderTransform>
</Canvas>
</UserControl>

然后在后面的代码中我这样做:

ZoomTransform.ScaleX = 3;
ZoomTransform.ScaleY = 3;

但是我说错了:

  

无法在对象'...'上设置属性,因为它处于只读状态。

所以我把它改成了:

var cloned = ZoomTransform.Clone();
cloned.ScaleX = 3;
cloned.ScaleY = 3;
ZoomTransform = cloned;

但现在实际上什么也没做......没有比例应用到我的画布上。

无论其

如果我删除ScaleTransform上的绑定并将其作为空的XAML元素:

<ScaleTransform />

然后在我的代码中我这样做:

(MyCanvas.RenderTransform as TransformGroup).Children[0] = new ScaleTransform(3, 3);

有效!我得到了应用的比例

所以有2个问题:

  1. 为什么我的变换Frozen是第一个?
  2. 克隆变换时,为什么我的绑定不起作用?
  3. 全部谢谢!

    更新

    以下是DP的定义:

    public static readonly DependencyProperty TranslateTransformProperty = DependencyProperty.Register("TranslateTransform",
                typeof(TranslateTransform),
                typeof(RoundByRoundControl),
                new PropertyMetadata(new TranslateTransform { X = 0, Y = 0 }));
    
            public static readonly DependencyProperty ZoomTransformProperty = DependencyProperty.Register("ZoomTransform",
                typeof(ScaleTransform),
                typeof(RoundByRoundControl),
                new PropertyMetadata(new ScaleTransform { ScaleX = 1, ScaleY = 1 }));
    
            public TranslateTransform TranslateTransform
            {
                get { return (TranslateTransform)GetValue(TranslateTransformProperty); }
                set { SetValue(TranslateTransformProperty, value); }
            }
    
            public ScaleTransform ZoomTransform
            {
                get { return (ScaleTransform)GetValue(ZoomTransformProperty); }
                set { SetValue(ZoomTransformProperty, value); }
            }
    

1 个答案:

答案 0 :(得分:1)

您传递的ScaleTransform作为ZoomTransform属性的默认值被PropertyMetadata冻结。一旦PropertyMetadata为passed to the Register method,将被冻结/密封。

  

但是,一旦消耗了元数据   作为对Register的调用的一部分,   AddOwner,或OverrideMetadata,   财产制度将密封   元数据实例和属性   现在被认为是不可改变的。   试图设置DefaultValue一次   IsSealed在此元数据上是真实的   实例将引发异常。

由于ScaleTransform是Freezable,因此它会在此过程中被冻结。

至于你的第二个问题,基于你提供的代码,它在克隆ZoomTransform时正确应用了ScaleTransform。必须有其他事情没有包括在内。

这假设您的UserControl的XAML包含一个x:Class属性,该属性与RoundByRoundControl的代码隐藏文件相关联。