Я пытаюсь создать пользовательский элемент управления, который перемещается по холсту. Я использую C # и WPF. Я вижу много примеров в сети, но мне просто нужен минимум.
Я нашел статью: «Перетаскиваемый элемент управления в WPF»
Кто-то ответил:
Если вы хотите сделать это руками, используйте следующий алгоритм:
При событии MouseDown: сохранить положение мыши, положение элемента управления TopLeft и дельту (смещение) этих координат и установить некоторый флаг логического поля, например. IsDragStartted для истины.
На MouseMove проверьте, что перетаскивание началось, и используйте положение и смещение мыши, чтобы вычислить новое значение положения элемента управления TopLeft
При событии MouseUp для IsDragStarted установлено значение false
У меня возникли проблемы с применением этого.
открытый частичный класс UserControl1: UserControl
{
private Point startingMousePosition;
private Point endingMousePosition;
private Point startingControlPosition;
bool isDragStarted;
public UserControl1()
{
InitializeComponent();
}
private void Grid_PreviewMouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{
if(!isDragStarted)
{
startingControlPosition.X = Canvas.GetLeft(this);
startingControlPosition.Y = Canvas.GetTop(this);
startingMousePosition.X = e.GetPosition(this.Parent as Canvas).X;
startingMousePosition.Y = e.GetPosition(this.Parent as Canvas).Y;
}
}
private void Grid_PreviewMouseMove(object sender, MouseEventArgs e)
{
if (e.LeftButton == MouseButtonState.Pressed)
{
isDragStarted = true;
if (isDragStarted)
{
endingMousePosition.X = e.GetPosition(this.Parent as Canvas).X;
endingMousePosition.Y = e.GetPosition(this.Parent as Canvas).Y;
Canvas.SetLeft(this, endingMousePosition.X - startingControlPosition.X);
Canvas.SetTop(this, endingMousePosition.Y - startingControlPosition.Y);
}
}
}
private void Grid_MouseLeftButtonUp(object sender, MouseButtonEventArgs e)
{
isDragStarted = false;
}
}
Вот мой код для формы WPF главного окна:
{
/// <summary>
/// Interaction logic for MainWindow.xaml
/// </summary>
public partial class MainWindow : Window
{
UserControl1 userCTL;
public MainWindow()
{
InitializeComponent();
userCTL = new UserControl1();
userCTL.Width = 50;
userCTL.Height = 100;
Canvas.SetTop(userCTL,20);
Canvas.SetLeft(userCTL, 20);
CanvasMain.Children.Add(userCTL);
}
private void Window_Loaded(object sender, RoutedEventArgs e)
{
AdornerLayer myAdornerLayer = AdornerLayer.GetAdornerLayer(userCTL);
if (myAdornerLayer != null)
{
myAdornerLayer.Add(new SimpleCircleAdorner(userCTL));
}
}
}
* *} Тысяча двадцать-один
Вот мой код WPF для главного окна:
<Window x:Class="WpfApplicationEvent.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="374.306" Width="594.271" Loaded="Window_Loaded">
<Grid>
<ScrollViewer Margin="46,23,74,33" PanningMode="Both" HorizontalScrollBarVisibility="Visible">
<Canvas x:Name="CanvasMain" Height="395" Width="506">
</Canvas>
</ScrollViewer>
</Grid>
</Window>
Я также попытался разместить украшения, чтобы в итоге изменить размер элемента управления. это ни к чему не привело, как получили украшатели, но они ничего не делают.
У меня есть все мои элементы управления перетаскиванием в моем UserControl1, который я создал, и я получил его для перетаскивания, но когда я снова щелкаю экземпляр UserControl1, чтобы перетащить его во второй раз, он сбрасывается в местоположения SetTop (0) и SetLeft (0). Он так странно прыгает! Я ожидал перетаскивания экземпляра UserControl1 в положение курсора. Он делает это с первой попытки, но затем я щелкаю UserControl1, чтобы перетащить его еще раз, и он переходит к (0,0) или близко к нему.