PDA

View Full Version : حرکت دادن کنترل ها در wpf



k.alami
پنج شنبه 15 خرداد 1393, 16:55 عصر
چطور میشه یه کنترل مانند image را توی wpf در زمان اجرا به وسیله ماوس حرکت داد؟

elec60
جمعه 16 خرداد 1393, 23:44 عصر
اگه منظورتون Drag and Drop باشه ميتونين از اين روش استفاده کنين:


Point _anchorPoint;
Point _currentPoint;
bool _isInDrag;

private void root_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{
var element = sender as FrameworkElement;
_anchorPoint = e.GetPosition(null);
if (element != null) element.CaptureMouse();
_isInDrag = true;
e.Handled = true;
}

private readonly TranslateTransform _transform = new TranslateTransform();
private void root_MouseMove(object sender, MouseEventArgs e)
{
if (!_isInDrag) return;
_currentPoint = e.GetPosition(null);

_transform.X += _currentPoint.X - _anchorPoint.X;
_transform.Y += (_currentPoint.Y - _anchorPoint.Y);
RenderTransform = _transform;
_anchorPoint = _currentPoint;
}

private void root_MouseLeftButtonUp(object sender, MouseButtonEventArgs e)
{
if (!_isInDrag) return;
var element = sender as FrameworkElement;
if (element != null) element.ReleaseMouseCapture();
_isInDrag = false;
e.Handled = true;
}

k.alami
شنبه 17 خرداد 1393, 17:24 عصر
خیلی ممنون از پاسختون.
من این کدها را برای یک کنترل image کپی کردم ولی هنگام move شدن خطا میده(Transform is not valid for Window.)
public partial class MainWindow : Window
{
Point _anchorPoint;
Point _currentPoint;
bool _isInDrag;
public MainWindow()
{
InitializeComponent();
}

private void Image_MouseLeftButtonDown_1(object sender, MouseButtonEventArgs e)
{
var element = sender as FrameworkElement;
_anchorPoint = e.GetPosition(null);
if (element != null) element.CaptureMouse();
_isInDrag = true;
e.Handled = true;
}

private void Image_MouseLeftButtonUp_1(object sender, MouseButtonEventArgs e)
{
if (!_isInDrag) return;
var element = sender as FrameworkElement;
if (element != null) element.ReleaseMouseCapture();
_isInDrag = false;
e.Handled = true;
}

private readonly TranslateTransform _transform = new TranslateTransform();
private void Image_MouseMove_1(object sender, MouseEventArgs e)
{
if (!_isInDrag) return;
_currentPoint = e.GetPosition(null);

_transform.X += _currentPoint.X - _anchorPoint.X;
_transform.Y += (_currentPoint.Y - _anchorPoint.Y);
RenderTransform = _transform;
_anchorPoint = _currentPoint;
}
}

elec60
یک شنبه 18 خرداد 1393, 12:49 عصر
خیلی ممنون از پاسختون.
من این کدها را برای یک کنترل image کپی کردم ولی هنگام move شدن خطا میده(Transform is not valid for Window.)
public partial class MainWindow : Window
{
Point _anchorPoint;
Point _currentPoint;
bool _isInDrag;
public MainWindow()
{
InitializeComponent();
}

private void Image_MouseLeftButtonDown_1(object sender, MouseButtonEventArgs e)
{
var element = sender as FrameworkElement;
_anchorPoint = e.GetPosition(null);
if (element != null) element.CaptureMouse();
_isInDrag = true;
e.Handled = true;
}

private void Image_MouseLeftButtonUp_1(object sender, MouseButtonEventArgs e)
{
if (!_isInDrag) return;
var element = sender as FrameworkElement;
if (element != null) element.ReleaseMouseCapture();
_isInDrag = false;
e.Handled = true;
}

private readonly TranslateTransform _transform = new TranslateTransform();
private void Image_MouseMove_1(object sender, MouseEventArgs e)
{
if (!_isInDrag) return;
_currentPoint = e.GetPosition(null);

_transform.X += _currentPoint.X - _anchorPoint.X;
_transform.Y += (_currentPoint.Y - _anchorPoint.Y);
RenderTransform = _transform;
_anchorPoint = _currentPoint;
}
}


شما تو رويداد Image_MouseMove_1 نوشتين: RenderTransform = _transform
و رويداد داخل كلاس MainWindow قرار داره. اين بدين معنيه كه RenderTransform ايكه شما نوشتين مربوط به پنجره اصليتون هست. اما پنجره تو WPF با استفاده از GDI رندر ميشه و نميشه Transform رو بهش اعمال كرد

بجاي RenderTransform بايد از Image.RenderTransform استفاده كنين. البته بايد از ننام كنترل Image تون استفاده كنيد. بنظر ميرسه اسمي براي كنترل Image در نظر نگرفتين.
بايد يه نام در نظر بگيرين

k.alami
یک شنبه 18 خرداد 1393, 22:57 عصر
واقعا ممنونم مشکل از همونجا بود و حل شد.