C# 缩放/平移后如何获取区域边界

C# 缩放/平移后如何获取区域边界,c#,wpf,xaml,zooming,C#,Wpf,Xaml,Zooming,我有一个简单的WPF界面,有两个面板。在右边,我有两个滑块,我用它来缩放和移动左面板上的一个简单形状 我还有一个MouseMove事件,当我将光标移动到形状上时会运行该事件 当我使用滑块平移/缩放形状,然后移动鼠标光标以获得鼠标位置时,我得到了正确的结果,这与缩放/变换之前和之后的结果不同。(如下图所示) 我想做的是如何在每次转换后获得区域的边界(蓝色) <Window x:Class="GUI.Window1" xmlns="http://schemas.microsof

我有一个简单的WPF界面,有两个面板。在右边,我有两个滑块,我用它来缩放和移动左面板上的一个简单形状

我还有一个MouseMove事件,当我将光标移动到形状上时会运行该事件

当我使用滑块平移/缩放形状,然后移动鼠标光标以获得鼠标位置时,我得到了正确的结果,这与缩放/变换之前和之后的结果不同。(如下图所示)

我想做的是如何在每次转换后获得区域的边界(蓝色)

<Window x:Class="GUI.Window1"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="Zoom Slider" Height="300" Width="600">
    <Grid>
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="300"></ColumnDefinition>
            <ColumnDefinition Width="300"></ColumnDefinition>
        </Grid.ColumnDefinitions>
        <Grid Background="Azure" x:Name="_window" MouseMove="_window_MouseMove">
        <Canvas x:Name="_c" Width="100" Height="100" 
                Background="Black" RenderTransformOrigin="0.5,0.5">
            <Canvas.RenderTransform>
                <TransformGroup>
                    <ScaleTransform ScaleX="{Binding ElementName=_zoomSlider, Path=Value}" 
                                    ScaleY="{Binding ElementName=_zoomSlider, Path=Value}"/>
                        <TranslateTransform X="{Binding ElementName=_panSlider, Path=Value}"/>
                    </TransformGroup>
            </Canvas.RenderTransform>
        </Canvas>
        </Grid>
        <StackPanel Background="Aquamarine" Grid.Column="1">
            <Slider x:Name="_zoomSlider" 
                    Maximum="2" Minimum="0.5" Value="1" 
                    Width="200"/>
            <Slider x:Name="_panSlider" 
                    Maximum="100" Minimum="-100" Value="0" 
                    Width="200"/>            
            <Label x:Name="_mousePosition">Mouse Position</Label>
            <Label x:Name="_boundaries">Boundaries</Label>
        </StackPanel>
    </Grid>
</Window>


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Shapes;

namespace GUI
{
    /// <summary>
    /// Interaction logic for Window1.xaml
    /// </summary>
    public partial class Window1 : Window
    {
        public Window1()
        {
            InitializeComponent();
        }


        private void _window_MouseMove(object sender, MouseEventArgs e)
        {
            _mousePosition.Content = (Math.Round(Mouse.GetPosition(_c).X)).ToString()
                + ", "
                + (Math.Round(Mouse.GetPosition(_c).Y)).ToString();
        }
    }
}


鼠标位置
边界
使用制度;
使用System.Collections.Generic;
使用System.Linq;
使用系统文本;
使用System.Windows;
使用System.Windows.Controls;
使用System.Windows.Data;
使用System.Windows.Documents;
使用System.Windows.Input;
使用System.Windows.Media;
使用System.Windows.Media.Imaging;
使用System.Windows.Shapes;
名称空间GUI
{
/// 
///Window1.xaml的交互逻辑
/// 
公共部分类Window1:Window
{
公共窗口1()
{
初始化组件();
}
私有void\u window\u MouseMove(对象发送方,MouseEventArgs e)
{
_mousePosition.Content=(Math.Round(Mouse.GetPosition(_c.X)).ToString()
+ ", "
+(Math.Round(Mouse.GetPosition(_c.Y)).ToString();
}
}
}

您似乎在要求:


你似乎在问这个问题:


你似乎在问这个问题:


你似乎在问这个问题:



它没有解释如何使用它。你否决了我的答案,因为我没有在你的例子中为你写下如何实现它?你试过用谷歌搜索那个方法吗?你去google.com,输入如何在wpf中转换为Visual怎么样?我知道这有很多工作,对吧。我在回答中给你举了个例子。不,我没有否决你的答案,也没有反对。因为我真的不知道如何处理这个答案。是的,我在谷歌上搜索了很多关于这一点的信息,但老实说,我没有找到合适的解决方案。你能告诉我你代码中点(0,0)背后的逻辑是什么吗?谢谢。文本块是一种视觉效果,可以说是100 x 20大。这意味着xaxis上有100个像素,yaxis上有20个像素。现在让我们按照这个想法,我们得出点(0,0)是零点。现在取textblock的零点,将其转换为stackpanel。如果文本块是stackpanel中的第五项,则转换为stackpanel时,结果将为品脱(0,100)。它没有解释如何使用它。您对我的答案投了反对票,因为我没有在示例中为您写下如何实现它?你试过用谷歌搜索那个方法吗?你去google.com,输入如何在wpf中转换为Visual怎么样?我知道这有很多工作,对吧。我在回答中给你举了个例子。不,我没有否决你的答案,也没有反对。因为我真的不知道如何处理这个答案。是的,我在谷歌上搜索了很多关于这一点的信息,但老实说,我没有找到合适的解决方案。你能告诉我你代码中点(0,0)背后的逻辑是什么吗?谢谢。文本块是一种视觉效果,可以说是100 x 20大。这意味着xaxis上有100个像素,yaxis上有20个像素。现在让我们按照这个想法,我们得出点(0,0)是零点。现在取textblock的零点,将其转换为stackpanel。如果文本块是stackpanel中的第五项,则转换为stackpanel时,结果将为品脱(0,100)。它没有解释如何使用它。您对我的答案投了反对票,因为我没有在示例中为您写下如何实现它?你试过用谷歌搜索那个方法吗?你去google.com,输入如何在wpf中转换为Visual怎么样?我知道这有很多工作,对吧。我在回答中给你举了个例子。不,我没有否决你的答案,也没有反对。因为我真的不知道如何处理这个答案。是的,我在谷歌上搜索了很多关于这一点的信息,但老实说,我没有找到合适的解决方案。你能告诉我你代码中点(0,0)背后的逻辑是什么吗?谢谢。文本块是一种视觉效果,可以说是100 x 20大。这意味着xaxis上有100个像素,yaxis上有20个像素。现在让我们按照这个想法,我们得出点(0,0)是零点。现在取textblock的零点,将其转换为stackpanel。如果文本块是stackpanel中的第五项,则转换为stackpanel时,结果将为品脱(0,100)。它没有解释如何使用它。您对我的答案投了反对票,因为我没有在示例中为您写下如何实现它?你试过用谷歌搜索那个方法吗?你去google.com,输入如何在wpf中转换为Visual怎么样?我知道这有很多工作,对吧。我在回答中给你举了个例子。不,我没有否决你的答案,也没有反对。因为我真的不知道如何处理这个答案。是的,我在谷歌上搜索了很多关于这一点的信息,但老实说,我没有找到合适的解决方案。你能告诉我你代码中点(0,0)背后的逻辑是什么吗?谢谢。文本块是一种视觉效果,可以说是100 x 20大。这意味着xaxis上有100个像素,yaxis上有20个像素。现在让我们按照这个想法,我们得出点(0,0)是零点。现在取textblock的零点,将其转换为stackpanel。如果文本块是stackpanel中的第五项,则转换为stackpanel时,结果将为品脱(01100)。
// Return the general transform for the specified visual object.
GeneralTransform generalTransform1 = myStackPanel.TransformToVisual(myTextBlock);

// Retrieve the point value relative to the child.
Point currentPoint = generalTransform1.Transform(new Point(0, 0));