假设自定义一个用户控件用以在父容器Grid里拖动/移动:
<UserControl x:Class="App6.Pic" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:local="using:App6" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" mc:Ignorable="d" ManipulationMode="All" ManipulationStarted="UserControl_ManipulationStarted" ManipulationDelta="UserControl_ManipulationDelta" d:DesignHeight="300" RenderTransformOrigin="0.5,0.5" d:DesignWidth="400"> <UserControl.RenderTransform> <TranslateTransform x:Name="t" /> </UserControl.RenderTransform> <Grid Background="AliceBlue"> <TextBlock Name="txt" Text="" /> </Grid> </UserControl>
using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Runtime.InteropServices.WindowsRuntime; using Windows.Foundation; using Windows.Foundation.Collections; using Windows.UI.Xaml; using Windows.UI.Xaml.Controls; using Windows.UI.Xaml.Controls.Primitives; using Windows.UI.Xaml.Data; using Windows.UI.Xaml.Input; using Windows.UI.Xaml.Media; using Windows.UI.Xaml.Navigation; // The User Control item template is documented at https://go.microsoft.com/fwlink/?LinkId=234236 namespace App6 { public sealed partial class Pic : UserControl { public Pic() { this.InitializeComponent(); } private void UserControl_ManipulationStarted(object sender, ManipulationStartedRoutedEventArgs e) { } private void UserControl_ManipulationDelta(object sender, ManipulationDeltaRoutedEventArgs e) { this.t.X += e.Delta.Translation.X; this.t.Y += e.Delta.Translation.Y; txt.Text = "" + (Parent as Grid).ActualWidth + ", " + t.X + this.Margin.Left + this.ActualWidth / 2; //判断核设置移动范围限制在父容器内 if ((Parent as Grid).ActualWidth < this.Margin.Left+ t.X + this.Width)//to right { this.t.X = (Parent as Grid).ActualWidth - (this.Margin.Left + this.Width); } if (0 >this.Margin.Left + t.X )//to left { this.t.X = - this.Margin.Left ; } if (0 > this.Margin.Top + t.Y)//to top { this.t.Y= -this.Margin.Top; } if ((Parent as Grid).ActualHeight < this.Margin.Top + t.Y + this.Height)//to bottom { this.t.Y = (Parent as Grid).ActualHeight - (this.Margin.Top + this.Height); } } } }