如何通过在wpf中选择形状的笔划来缩放形状

如何通过在wpf中选择形状的笔划来缩放形状,wpf,wpf-controls,Wpf,Wpf Controls,我是WPF新手,我想通过选择椭圆的笔划来缩放椭圆。我已将IsManipulationEnabled设置为true,但事件未触发。下面是我的代码 <Path Stretch="Fill" Stroke="Black" ManipulationDelta="Path_ManipulationDelta" IsManipulationEnabled="True" StrokeThickness="4"> <Path.Data>

我是WPF新手,我想通过选择椭圆的笔划来缩放椭圆。我已将IsManipulationEnabled设置为true,但事件未触发。下面是我的代码

 <Path Stretch="Fill" Stroke="Black" ManipulationDelta="Path_ManipulationDelta" 
      IsManipulationEnabled="True" StrokeThickness="4">
        <Path.Data>
            <EllipseGeometry Center="0,0"   RadiusX="200" RadiusY="200"/>
        </Path.Data>
    </Path>


请提供帮助。

以下是一些代码,可以为您提供一些想法:

在这个示例中,我使用了一些基本的鼠标事件
MouseDown
MouseMove
MouseUp
,这样我可以检测用户何时单击
路径以及何时开始拖动鼠标

XAML

我希望这有帮助。

XAML
XAML
     XAML
<Window x:Class="WidgetWpf.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:WidgetWpf"
        mc:Ignorable="d"
        Title="MainWindow" Height="450" Width="800">   
    <Viewbox>
        <Grid Name="MainGrid">           

            <Ellipse x:Name="DottedCircle" Width="200" Height="200"  Stroke="White" StrokeThickness="2"   Opacity="0.90" StrokeDashArray="4 4"
                     MouseDown="DottedCircle_MouseDown"
                     MouseMove="DottedCircle_MouseMove"
                     MouseUp="DottedCircle_MouseUp"
                     MouseEnter="DottedCircle_MouseEnter"
                     MouseLeave="DottedCircle_MouseLeave"  
                     />            
        </Grid>    
    </Viewbox>

</Window>
//Here is my code behind 

    public partial class MainWindow : Window
    {
        #region Variables
        MatrixTransform transform;
        Point OldMousePosition;
        Point NewMousePosition;
        double[] Dimensions = new double[2];
        Rect rect = new Rect();
        bool IsResizeMode;
        bool IsDragAndDropMode;

        #endregion
        public MainWindow()
        {
            InitializeComponent();
        }

        private void DottedCircle_MouseDown(object sender, MouseButtonEventArgs e)
        {
            if (e.ChangedButton != MouseButton.Left) return;
            Mouse.Capture(DottedCircle);
            OldMousePosition = e.GetPosition(MainGrid);
        }

        private void DottedCircle_MouseMove(object sender, MouseEventArgs e)
        {

            DottedCircle.ToolTip = e.GetPosition(MainGrid);
            if (e.LeftButton != MouseButtonState.Pressed) return;
            var NewMousePosition = e.GetPosition(MainGrid);         
            var offset = NewMousePosition-OldMousePosition;

            #region working by co-ordinate

            //get center of grid

            double dicisionPoint=0.0 ;
            double CP_X = MainGrid.ActualWidth / 2;
            double CP_Y = MainGrid.ActualHeight / 2;

            //1 st co-ordinate
            if(NewMousePosition.X>CP_X && NewMousePosition.Y<CP_Y)
            {
                dicisionPoint = offset.X;
            }
            //2nd cordinate
            else if (NewMousePosition.X < CP_X && NewMousePosition.Y < CP_Y)
            {
                dicisionPoint = -offset.X;
            }
            else if (NewMousePosition.X < CP_X && NewMousePosition.Y > CP_Y)
            {
                dicisionPoint = offset.Y;
            }
            else if (NewMousePosition.X > CP_X && NewMousePosition.Y > CP_Y)
            {
                dicisionPoint = offset.Y;
            }


            if (DottedCircle.Width+ dicisionPoint < InnerCircle.Width)
            {
                DottedCircle.Fill = new SolidColorBrush(Colors.Transparent);
                DottedCircle.Width += dicisionPoint;
                DottedCircle.Height += dicisionPoint;
            }
            else if (DottedCircle.Width+ dicisionPoint>= InnerCircle.Width) { DottedCircle.Fill = new SolidColorBrush(Colors.Red); }
            #endregion



            OldMousePosition = NewMousePosition;
            DottedCircle.ToolTip = offset.X+ "__" + offset.Y;
        }

        private void DottedCircle_MouseUp(object sender, MouseButtonEventArgs e)
        {
            Mouse.Capture(null);
            DottedCircle.Style = null;
        }

        private void DottedCircle_MouseEnter(object sender, MouseEventArgs e)
        {
            DottedCircle.Stroke = new SolidColorBrush( Colors.Blue);
            DottedCircle.Style = (Style)Application.Current.Resources["DiffPathStyle"];
        }

        private void DottedCircle_MouseLeave(object sender, MouseEventArgs e)
        {
            DottedCircle.Stroke = new SolidColorBrush(Colors.White);
            DottedCircle.Style = null;
        }
    }
XAML //这是我的密码 公共部分类主窗口:窗口 { #区域变量 矩阵变换; 点鼠标定位; 点位; 双[]尺寸=新双[2]; Rect Rect=新的Rect(); 布尔-伊斯雷西莫德; bool-isdragandropmode; #端区 公共主窗口() { 初始化组件(); } 私有void dottedcirle_MouseDown(对象发送器,MouseButtonEventArgs e) { 如果(e.ChangedButton!=MouseButton.Left)返回; 鼠标捕捉(点圆); OldMousePosition=e.GetPosition(主栅格); } 私有void dottedcirle\u MouseMove(对象发送方,MouseEventArgs e) { DottedCircle.ToolTip=e.GetPosition(主栅格); 如果(例如,LeftButton!=MouseButtonState.Pressed)返回; var NewMousePosition=e.GetPosition(主栅格); var offset=新鼠标位置OldMousePosition; #区域协调工作 //获得网格中心 双分界点=0.0; 双CP_X=MainGrid.ActualWidth/2; 双CP_Y=主栅格。实际高度/2; //第一坐标 if(NewMousePosition.X>CP_X&&NewMousePosition.Y CP_Y) { dicisionPoint=偏移量Y; } else if(NewMousePosition.X>CP_X&&NewMousePosition.Y>CP_Y) { dicisionPoint=偏移量Y; } if(点圆宽度+切点<内圆宽度) { dottedcirle.Fill=新的SolidColorBrush(Colors.Transparent); 圆点圆。宽度+=分界点; 圆点圆。高度+=分界点; } else如果(DottedCircle.Width+dicisionPoint>=InnerCircle.Width){DottedCircle.Fill=new SolidColorBrush(Colors.Red);} #端区 OldMousePosition=NewMousePosition; DottedCircle.ToolTip=offset.X+“_uu”+offset.Y; } 私有void dottedcroull_MouseUp(对象发送器,MouseButtonEventArgs e) { 鼠标捕捉(空); dottedcirle.Style=null; } 私有void DottedCircle\u MouseEnter(对象发送方,MouseEventArgs e) { dottedcirle.Stroke=新的SolidColorBrush(Colors.Blue); dottedcirle.Style=(Style)Application.Current.Resources[“DiffPathStyle”]; } 私有void dottedcirle\u MouseLeave(对象发送方,MouseEventArgs e) { dottedcirle.Stroke=新的SolidColorBrush(Colors.White); dottedcirle.Style=null; } }
您知道操纵事件仅适用于触摸输入吗?谢谢,Keithernet这很有帮助。但在这种情况下,形状缩放不是平滑的。请你帮个忙。我的答案是让你开始绘制草图。我认为这将是一个很好的学习练习,你可以尝试找出如何使它变得更好、更流畅。:)谢谢,Keithernet你的帮助对我来说没什么帮助。在这里我张贴我的完整解决方案
using System.Windows;
using System.Windows.Input;

namespace WpfApp4
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        private Point oldMousePosition;

        public MainWindow()
        {
            InitializeComponent();
        }

        private void OnMouseDown(object sender, MouseButtonEventArgs e)
        {
            if(e.ChangedButton != MouseButton.Left) return;
            Mouse.Capture(CirclePath);
            oldMousePosition = e.GetPosition(Canvas);
        }

        private void OnMouseMove(object sender, MouseEventArgs e)
        {
            if (e.LeftButton != MouseButtonState.Pressed) return;

            var newMousePosition = e.GetPosition(Canvas);
            var offset = newMousePosition - oldMousePosition;

            EllipseGeometry.RadiusX += offset.X / 2;
            EllipseGeometry.RadiusY += offset.Y / 2;

            oldMousePosition = newMousePosition;
        }

        private void OnMouseUp(object sender, MouseButtonEventArgs e)
        {
            Mouse.Capture(null);
        }
    }
}
XAML
     XAML
<Window x:Class="WidgetWpf.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:WidgetWpf"
        mc:Ignorable="d"
        Title="MainWindow" Height="450" Width="800">   
    <Viewbox>
        <Grid Name="MainGrid">           

            <Ellipse x:Name="DottedCircle" Width="200" Height="200"  Stroke="White" StrokeThickness="2"   Opacity="0.90" StrokeDashArray="4 4"
                     MouseDown="DottedCircle_MouseDown"
                     MouseMove="DottedCircle_MouseMove"
                     MouseUp="DottedCircle_MouseUp"
                     MouseEnter="DottedCircle_MouseEnter"
                     MouseLeave="DottedCircle_MouseLeave"  
                     />            
        </Grid>    
    </Viewbox>

</Window>
//Here is my code behind 

    public partial class MainWindow : Window
    {
        #region Variables
        MatrixTransform transform;
        Point OldMousePosition;
        Point NewMousePosition;
        double[] Dimensions = new double[2];
        Rect rect = new Rect();
        bool IsResizeMode;
        bool IsDragAndDropMode;

        #endregion
        public MainWindow()
        {
            InitializeComponent();
        }

        private void DottedCircle_MouseDown(object sender, MouseButtonEventArgs e)
        {
            if (e.ChangedButton != MouseButton.Left) return;
            Mouse.Capture(DottedCircle);
            OldMousePosition = e.GetPosition(MainGrid);
        }

        private void DottedCircle_MouseMove(object sender, MouseEventArgs e)
        {

            DottedCircle.ToolTip = e.GetPosition(MainGrid);
            if (e.LeftButton != MouseButtonState.Pressed) return;
            var NewMousePosition = e.GetPosition(MainGrid);         
            var offset = NewMousePosition-OldMousePosition;

            #region working by co-ordinate

            //get center of grid

            double dicisionPoint=0.0 ;
            double CP_X = MainGrid.ActualWidth / 2;
            double CP_Y = MainGrid.ActualHeight / 2;

            //1 st co-ordinate
            if(NewMousePosition.X>CP_X && NewMousePosition.Y<CP_Y)
            {
                dicisionPoint = offset.X;
            }
            //2nd cordinate
            else if (NewMousePosition.X < CP_X && NewMousePosition.Y < CP_Y)
            {
                dicisionPoint = -offset.X;
            }
            else if (NewMousePosition.X < CP_X && NewMousePosition.Y > CP_Y)
            {
                dicisionPoint = offset.Y;
            }
            else if (NewMousePosition.X > CP_X && NewMousePosition.Y > CP_Y)
            {
                dicisionPoint = offset.Y;
            }


            if (DottedCircle.Width+ dicisionPoint < InnerCircle.Width)
            {
                DottedCircle.Fill = new SolidColorBrush(Colors.Transparent);
                DottedCircle.Width += dicisionPoint;
                DottedCircle.Height += dicisionPoint;
            }
            else if (DottedCircle.Width+ dicisionPoint>= InnerCircle.Width) { DottedCircle.Fill = new SolidColorBrush(Colors.Red); }
            #endregion



            OldMousePosition = NewMousePosition;
            DottedCircle.ToolTip = offset.X+ "__" + offset.Y;
        }

        private void DottedCircle_MouseUp(object sender, MouseButtonEventArgs e)
        {
            Mouse.Capture(null);
            DottedCircle.Style = null;
        }

        private void DottedCircle_MouseEnter(object sender, MouseEventArgs e)
        {
            DottedCircle.Stroke = new SolidColorBrush( Colors.Blue);
            DottedCircle.Style = (Style)Application.Current.Resources["DiffPathStyle"];
        }

        private void DottedCircle_MouseLeave(object sender, MouseEventArgs e)
        {
            DottedCircle.Stroke = new SolidColorBrush(Colors.White);
            DottedCircle.Style = null;
        }
    }