【问题标题】:WPF: TranslateTransform X property not updatingWPF:TranslateTransform X 属性未更新
【发布时间】:2014-08-07 07:34:26
【问题描述】:

我有一个奇怪的问题,我在 Grid 中注册了事件 TouchMove

_outerGrid.TouchMove += _outerGrid_TouchMove;

我保存最后一个接触点,并计算最后一个接触点和实际接触点之间的位移。

double dx = actualPoint.X - _lastMovePoint.X;
double dy = actualPoint.Y - _lastMovePoint.Y;

现在,如果我尝试相应地移动 UIElement,我会发现 Y 属性正确更新,但 X 没有。

TransformGroup tg = element.RenderTransform as TransformGroup;

TranslateTransform t = tg.Children[1] as TranslateTransform;
t.X += dx; //Remains unchanged after the sum, and dx != 0
t.Y += dy;

我之前创建了一个带有 ScaleTransform 和 TranslateTransform 的 TransformGroup 以将元素放置在带有动画的正确位置...现在如果我尝试移动它,它就不起作用了

        double startPointX = -100;
        double accelRatio = 0.5;
        double decelRatio = 0.5;

        element.RenderTransformOrigin = new Point(0.5, 0.5);

        TransformGroup tg = tg = new TransformGroup();
        TranslateTransform t = new TranslateTransform();
        ScaleTransform s = new ScaleTransform();

        tg.Children.Add(s);
        tg.Children.Add(t);
        element.RenderTransform = tg;

        DoubleAnimation xAnim = new DoubleAnimation();
        xAnim.From = displX - startPointX;
        xAnim.To = displX;
        xAnim.Duration = TimeSpan.FromMilliseconds(dur);
        xAnim.BeginTime = TimeSpan.FromMilliseconds(delay);
        xAnim.AccelerationRatio = accelRatio;
        xAnim.DecelerationRatio = decelRatio;

        DoubleAnimation sAnim = new DoubleAnimation();
        sAnim.From = 0;
        sAnim.To = 1;
        sAnim.Duration = TimeSpan.FromMilliseconds(dur);
        sAnim.BeginTime = TimeSpan.FromMilliseconds(delay);

        DoubleAnimation oAnim = new DoubleAnimation();
        oAnim.From = 0;
        oAnim.To = 1;
        oAnim.Duration = TimeSpan.FromMilliseconds(dur);
        oAnim.BeginTime = TimeSpan.FromMilliseconds(delay);

        s.BeginAnimation(ScaleTransform.ScaleXProperty, sAnim);
        s.BeginAnimation(ScaleTransform.ScaleYProperty, sAnim);
        t.BeginAnimation(TranslateTransform.XProperty, xAnim);
        t.Y = displY;

        element.BeginAnimation(OpacityProperty, oAnim);

我注意到,如果我以动画 X 的方式为 Y 属性设置动画,那么 Y 也会开始出现同样的问题。所以它与动画属性有关,然后尝试设置它

有人知道是什么导致了这种行为吗?

谢谢。

【问题讨论】:

  • 你的问题就像我给你看我车上的油箱盖,说我加了油,但车子不开……这是怎么回事?您需要做的是提供concise, working code example that demonstrates your problem,然后我们可以对其进行测试,并希望为您找到解决方案。
  • 试图用更多信息更新它

标签: c# wpf transformation uielement


【解决方案1】:

如果您查看 MSDN 上的 TranslateTransform Class 页面,您会看到:

扩展 Freezable class 的通知,其中:

定义具有可修改状态和只读(冻结)状态的对象。派生自 Freezable 的类提供详细的更改通知,可以设为不可变,并且可以克隆自己。

所以你的问题是因为TranslateTransform 是不可变的(这意味着你不能改变它)。因此,不要像最初那样尝试更改原始 TranslateTransform 的值,而是需要每次要更改它时创建一个新实例

TransformGroup tg = element.RenderTransform as TransformGroup;    
TranslateTransform t = tg.Children[1] as TranslateTransform;
t.X += dx; // Remains unchanged because TranslateTransform is immutable 
t.Y += dy; // Remains unchanged because TranslateTransform is immutable 

相反,创建一个新的TranslateTransform 并设置它(如您所见):

TransformGroup tg = element.RenderTransform as TransformGroup;    
TranslateTransform t = new TranslateTransform(); // Use new TranslateTransform here
t.X = (tg.Children[1] as TranslateTransform).X + dx;
t.Y = (tg.Children[1] as TranslateTransform).Y + dy;    
tg.Children[1] = t;

【讨论】:

  • 是的,它有效!但是您也可以在我编辑的答案中应用该解决方案(顺便说一下,这是 MSDN 中建议的)。谢谢!
  • 这不应该是一个替代答案。在您原来的回答中,您写道:反正我也不知道为什么……。我认为如果我解释原因会很有帮助。
  • 是的,我明白了,现在我知道为什么了:)
【解决方案2】:

这个方案解决了问题:

TransformGroup tg = element.RenderTransform as TransformGroup;

TranslateTransform t = new TranslateTransform();
t.X = (tg.Children[1] as TranslateTransform).X + dx;
t.Y = (tg.Children[1] as TranslateTransform).Y + dy;

tg.Children[1] = t;

解释在这里:http://msdn.microsoft.com/en-us/library/aa970493(v=vs.110).aspx

DoubleAnimation 仍在覆盖基值。如果你想让基值再次成为有效值,你必须停止动画对属性的影响,你可以这样做:

TransformGroup tg = element.RenderTransform as TransformGroup;

TranslateTransform t = tg.Children[1] as TranslateTransform;
double tx = t.X;
double ty = t.Y;
t.BeginAnimation(TranslateTransform.XProperty, null);
t.BeginAnimation(TranslateTransform.YProperty, null);
t.X = tx + dx;
t.Y = ty + dy;

【讨论】:

    猜你喜欢
    • 2012-02-04
    • 2017-02-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-06
    • 2018-02-22
    • 2019-04-18
    相关资源
    最近更新 更多