gpt4 book ai didi

WPF 为什么我的 ScaleTransform 卡住了,我该如何绑定(bind)它?

转载 作者:行者123 更新时间:2023-12-03 17:08:55 25 4
gpt4 key购买 nike

我有一个非常简单的用户控件,我想绑定(bind)一个 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;

但我收到一条错误消息:

Cannot set a property on object '...' because it is in a read-only state.



所以我把它改成:
var cloned = ZoomTransform.Clone();
cloned.ScaleX = 3;
cloned.ScaleY = 3;
ZoomTransform = cloned;

但现在这实际上什么也没做......我的 Canvas 上没有任何比例。

然而

如果我删除 ScaleTransform 上的绑定(bind)并将其作为一个空的 XAML 元素:
<ScaleTransform />

然后在我的代码中我这样做:
(MyCanvas.RenderTransform as TransformGroup).Children[0] = new ScaleTransform(3, 3);

有用!我得到了应用的规模

所以2个问题:
  • 为什么我的 Transform Frozen是第一名吗?
  • 为什么我克隆转换时绑定(bind)不起作用?

  • 谢谢大家!

    更新:

    这是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); }
    }

    最佳答案

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

    However, once the metadata is consumed as part of a call to Register, AddOwner, or OverrideMetadata, the property system will seal that metadata instance and the properties are now considered immutable. Attempting to set DefaultValue once IsSealed is true on this metadata instance will raise an exception.



    由于 ScaleTransform 是 Freezable,因此在此过程中将其卡住。

    至于第二个问题,根据您提供的代码,它在克隆 ZoomTransform 时确实正确应用了 ScaleTransform。一定还有其他你没有包括在内的事情发生。

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

    关于WPF 为什么我的 ScaleTransform 卡住了,我该如何绑定(bind)它?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2277399/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com