Windows 8 WinRT UI元素在操作期间跟随另一个

Windows 8 WinRT UI元素在操作期间跟随另一个,windows-8,windows-runtime,Windows 8,Windows Runtime,我试图在UI元素(矩形)上使用操纵,可以毫无问题地旋转和转换它。我想要实现的是在第一个(矩形)后面创建另一个UI元素(例如椭圆) 如果我将相同的变换组(用于矩形)应用于椭圆,则在平移操作期间效果良好,但在旋转期间椭圆不会跟随矩形 我想我必须找到一个合适的复合变换中心点来提供给椭圆,但我不知道怎么做 下面是相应的示例代码 public MainPage() { this.InitializeComponent(); rectMy.Manipulat

我试图在UI元素(矩形)上使用操纵,可以毫无问题地旋转和转换它。我想要实现的是在第一个(矩形)后面创建另一个UI元素(例如椭圆)

如果我将相同的变换组(用于矩形)应用于椭圆,则在平移操作期间效果良好,但在旋转期间椭圆不会跟随矩形

我想我必须找到一个合适的复合变换中心点来提供给椭圆,但我不知道怎么做

下面是相应的示例代码

    public MainPage()
    {
        this.InitializeComponent();

        rectMy.ManipulationMode = ManipulationModes.None | ManipulationModes.TranslateX | ManipulationModes.TranslateY | ManipulationModes.Rotate;
        rectMy.ManipulationStarted += rectMy_ManipulationStarted;
        rectMy.ManipulationDelta += rectMy_ManipulationDelta;
        rectMy.ManipulationCompleted += rectMy_ManipulationCompleted;

        transformGroup.Children.Add(previousTransform);
        transformGroup.Children.Add(compositeTransform);

        rectMy.RenderTransform = transformGroup;
    }

    void rectMy_ManipulationCompleted(object sender, ManipulationCompletedRoutedEventArgs e)
    {
        e.Handled = true;
    }

    void rectMy_ManipulationDelta(object sender, ManipulationDeltaRoutedEventArgs e)
    {
        previousTransform.Matrix = transformGroup.Value;

        Point center = previousTransform.TransformPoint(new Point(rectMy.Width / 2, rectMy.Height / 2));
        compositeTransform.CenterX = center.X;
        compositeTransform.CenterY = center.Y;

        compositeTransform.Rotation = e.Delta.Rotation;
        compositeTransform.ScaleX = compositeTransform.ScaleY = e.Delta.Scale;
        compositeTransform.TranslateX = e.Delta.Translation.X;
        compositeTransform.TranslateY = e.Delta.Translation.Y;
    }

    void rectMy_ManipulationStarted(object sender, ManipulationStartedRoutedEventArgs e)
    {
        e.Handled = true;
    }

嗯。我现在更明白了,找到了解决办法。这都是关于复合变换的中心点(正如我最初猜测的那样)。对于椭圆的中心,我必须输入矩形的中心。但是,需要给出相对于椭圆的坐标。在我的例子中,椭圆位于矩形的右上角,下面是我给出的复合变换中心

Point centerE = previousTransformE.TransformPoint(new Point(-rectMy.Width / 2 + ellipseMy.Width / 2, rectMy.Height / 2 + ellipseMy.Height / 2));
对于矩形,复合变换的中心点为:

Point center = previousTransform.TransformPoint(new Point(rectMy.Width / 2, rectMy.Height / 2));
Stackoverflow不允许我发布一个图像来更好地可视化事物。对不起

整个代码:

previousTransform.Matrix = transformGroup.Value;
previousTransformE.Matrix = transformGroupE.Value;

Point center = previousTransform.TransformPoint(new Point(rectMy.Width / 2, rectMy.Height / 2));
compositeTransform.CenterX = center.X;
compositeTransform.CenterY = center.Y;

compositeTransform.Rotation = e.Delta.Rotation;
compositeTransform.TranslateX = e.Delta.Translation.X;
compositeTransform.TranslateY = e.Delta.Translation.Y;

Point centerE = previousTransformE.TransformPoint(new Point(-rectMy.Width / 2 + ellipseMy.Width / 2, rectMy.Height / 2 + ellipseMy.Height / 2));
compositeTransformE.CenterX = centerE.X;
compositeTransformE.CenterY = centerE.Y;

compositeTransformE.Rotation = e.Delta.Rotation;
compositeTransformE.TranslateX = e.Delta.Translation.X;
compositeTransformE.TranslateY = e.Delta.Translation.Y;

您可以使用TransformGroup按需要的顺序进行变换(平移、旋转、再次平移)。相同的TransformGroup也会使椭圆移动,但方式不同。椭圆在操纵前居中于矩形的右上角。在操作矩形后,椭圆不再存在。显然,变换组需要不同,你需要阅读矩阵变换代数来解决这个问题,但是,你也可以把它们都放在同一个共享容器中,然后简单地将转换应用到容器中。是的,我也这么认为,但我找不到指导我研究2x2矩阵以修改并获得我想要的东西的文档。你知道吗?