Dragging a WPF user control
I created a movable UserControl
<UserControl x:Class="Restaurant.Views.Managerer.TablePanel"
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:Restaurant.Helpers.Converter"
mc:Ignorable="d"
x:Name="root"
MouseLeftButtonDown="root_MouseLeftButtonDown"
MouseLeftButtonUp="root_MouseLeftButtonUp"
MouseMove="root_MouseMove"
DataContext="{Binding RelativeSource={RelativeSource Self}}">
....
Code
Point anchorPoint;
Point currentPoint;
bool isInDrag = false;
private void root_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{
var element = sender as FrameworkElement;
anchorPoint = e.GetPosition(null);
element.CaptureMouse();
isInDrag = true;
e.Handled = true;
}
private void root_MouseMove(object sender, MouseEventArgs e)
{
if (isInDrag)
{
var element = sender as FrameworkElement;
currentPoint = e.GetPosition(null);
var transform = new TranslateTransform
{
X = (currentPoint.X - anchorPoint.X),
Y = (currentPoint.Y - anchorPoint.Y)
};
this.RenderTransform = transform;
anchorPoint = currentPoint;
}
}
private void root_MouseLeftButtonUp(object sender, MouseButtonEventArgs e)
{
if (isInDrag)
{
var element = sender as FrameworkElement;
element.ReleaseMouseCapture();
isInDrag = false;
e.Handled = true;
}
}
If I change the code from
X = (currentPoint.X - anchorPoint.X),
Y = (currentPoint.Y - anchorPoint.Y)
to
X = (currentPoint.X),
Y = (currentPoint.Y)
I can move the UserControl
, but the mou开发者_StackOverflow社区se and UserControl
do not match
Good morning. I slept and can think )))
private TranslateTransform transform = new TranslateTransform();
private void root_MouseMove(object sender, MouseEventArgs e)
{
if (isInDrag)
{
var element = sender as FrameworkElement;
currentPoint = e.GetPosition(null);
transform.X += currentPoint.X - anchorPoint.X;
transform.Y += (currentPoint.Y - anchorPoint.Y);
this.RenderTransform = transform;
anchorPoint = currentPoint;
}
}
I really am not sure what exactly you're trying to accomplish in your question but Thumbs are much easier for dragging motions. You can see an explanation and sample code (at the bottom) here.
Based upon information in @Mediator answer. I have came up and edited to prevent the control from going out of bounds.
private TranslateTransform transform = new TranslateTransform();
private void root_MouseMove(object sender, MouseEventArgs e)
{
if (isInDrag)
{
var element = sender as FrameworkElement;
currentPoint = e.GetPosition(null);
transform.X += currentPoint.X - anchorPoint.X;
transform.Y += (currentPoint.Y - anchorPoint.Y);
if (currentPoint.X < Application.Current.MainWindow.RenderSize.Width && currentPoint.Y < Application.Current.MainWindow.RenderSize.Height
&& currentPoint.X > 0 && currentPoint.Y > 0 )
{
this.RenderTransform = transform;
anchorPoint = currentPoint;
}
else
{
transform = new TranslateTransform();
this.RenderTransform = transform;
}
}
}
But binding errors are their in output window in VS.
It looks like this is an issue in WPF, but one that Microsoft won't fix.
For more info here:
https://connect.microsoft.com/VisualStudio/feedback/details/1423399/system-windows-data-error-4-when-using-relativesource-findancestor-inside-a-translatetransform-inside-a-style
精彩评论