我有一个非常简单的用户控件,我想在后面的代码中将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个问题:
Frozen
是第一个?全部谢谢!
更新
以下是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); }
}
答案 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的代码隐藏文件相关联。