【问题标题】:How to get the boundaries of an area after scale/translate如何在缩放/平移后获取区域的边界
【发布时间】:2014-02-15 12:16:02
【问题描述】:

我有一个带有两个面板的简单 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();
        }
    }
}

【问题讨论】:

    标签: c# wpf xaml zooming


    【解决方案1】:

    你似乎在问这个:

    http://msdn.microsoft.com/en-us/library/system.windows.uielement.transformtovisual(v=vs.95).aspx

    // 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));
    

    【讨论】:

    • 没有说明如何使用。
    • 您对我的回答投了反对票,因为我没有为您写下如何在您的示例中实现它?您是否尝试过使用该方法?您如何访问 google.com 并输入如何在 wpf 中转换为可视化?我知道它的工作量很大,对。我在回答中向您发布了一个示例。
    • 不,我没有否决你的答案我也没有投赞成票。因为我真的不知道如何处理答案。是的,我在谷歌上搜索了很多,但老实说我没有找到合适的解决方案。
    • 您能告诉我代码中 Point(0,0) 背后的逻辑是什么吗?谢谢。
    • 文本块是一个视觉对象,可以说它的大小为 100 x 20。这意味着 x 轴上有 100 个像素,y 轴上有 20 个像素。现在让我们遵循这个想法,我们提出 point(0,0) 是零点。现在您将文本块的零点转换为堆栈面板。如果文本块是 stackpanel 中的第五项,则转换为 stackpanel 时结果将为 pint(0, 100)。
    猜你喜欢
    • 1970-01-01
    • 2013-02-27
    • 1970-01-01
    • 1970-01-01
    • 2021-01-19
    • 1970-01-01
    • 1970-01-01
    • 2022-09-29
    • 1970-01-01
    相关资源
    最近更新 更多