#c# #wpf #xaml #move #drag
#c# #wpf ( ВП ) #xaml #переместить #перетаскивание #wpf
Вопрос:
У меня есть проект WPF C # с классом DragCanvas_ (см.https://www.codeproject.com/Articles/15354/Dragging-Elements-in-a-Canvas ), чтобы я мог перемещать каждый дочерний элемент, который я создал в MainWindow.xaml-файле WPF-проекта, между Dragcanvas, то есть между <jas:DragCanvas_ x:Name="dragCanvas_"
и </jas:DragCanvas_>
в xaml-коде. Перемещение выполняется путем перетаскивания дочерних элементов мышью ( OnPreviewMouseLeftButtonDown(MouseButtonEventArgs e)
).
Внутри открытого класса DragCanvas_ я написал следующий код, чтобы получить координаты дочерних элементов из DragCanvas при перемещении их с помощью мыши. Я могу распечатать их в консоли во время выполнения с Console.WriteLine();
внутри класса DragCanvas_, но мне нужны две координаты внутри MainWindow.xaml.cs-файла, то есть внутри класса MainWindow.xaml.cs. Внутри MainWindow.xaml.cs-файла находится метод, который должен использовать эти две координаты для изменения положения ROI_RECTANGLE (элементов, которые находятся внутри DragCanvas_ для перетаскивания).
Вот код внутри DragCanvas_.cs-файла (класс DragCanvas_) для получения двух координат leftMargin и topMargin перетаскиваемых элементов внутри DragCanvas_:
protected override void OnPreviewMouseUp(MouseButtonEventArgs e)
{
base.OnPreviewMouseUp(e);
var positionTransform = this.ElementBeingDragged.TransformToAncestor(this);
var areaPosition = positionTransform.Transform(new Point(0, 0));
// Reset the field whether the left or right mouse button was
// released, in case a context menu was opened on the drag element.
this.ElementBeingDragged = null;
if (this.ElementBeingDragged != null)
{
this.ElementBeingDragged = null;
}
LeftMargin = areaPosition.X;
TopMargin = areaPosition.Y;
//Console.WriteLine(LeftMargin);//these two work of course, but I need the two variables inside a method in another class of the C# project
//Console.WriteLine(TopMargin);
}
И две переменные leftMargin и topMargin объявлены как общедоступные в начале класса DragCanvas_ следующим образом:
public class DragCanvas_ : Canvas
{
public double LeftMargin { get; set; }
public double TopMargin { get; set; }
// the rest of the code...
}
Для использования нескольких значений двух переменных leftMargin и topMargin внутри MainWindow.xaml.cs-файла я пишу внутри MainWindow.xaml.cs-файла следующий код:
namespace ABC
{
public partial class MainWindow : Window
static void Main(string[] args)
{
DragCanvas_ myDragCanvasObject = new DragCanvas_(); // new instance of DragCanvas_ class
if (myDragCanvasObject != null)
{
myDragCanvasObject = null;
}
Console.WriteLine(myDragCanvasObject.LeftMargin);
Console.WriteLine(myDragCanvasObject.TopMargin);
}
Я также уже добавил public Window() : base() { }
между public partial class MainWindow : Window
и static void Main(string[] args)
, но это тоже не помогло.
Я действительно не знаю, что делать, и в отчаянии от этой проблемы. Я просто не могу понять, в чем может быть причина. Помощь действительно ценится. Заранее благодарю.
Ответ №1:
Вы не должны создавать новый экземпляр DragCanvas
в исходном коде. Вместо этого вы должны получить доступ к свойствам той, которую вы уже добавили в свою разметку XAML:
Console.WriteLine(dragCanvas_.LeftMargin);
Console.WriteLine(dragCanvas_.TopMargin);
«dragCanvas_» относится к имени элемента в разметке XAML:
<jas:DragCanvas_ x:Name="dragCanvas_" ... />
Комментарии:
1. Спасибо за ваше предложение. Я попробовал ваше предложение, которое имеет смысл, потому что DragCanvas уже является объектом и ссылается на имя разметки XAML. В файле MainWindow.xaml.cs я сначала написал
public void WriteLeftMarginInConsole() { Console.WriteLine(dragCanvas_.TopMargin); }
topMargin в качестве примера. Но консоль не отображает пиксели в консоли. Если я напишуConsole.WriteLine(TopMargin);
внутри DragCanvas_.cs-файла, он работает так, как я уже говорил в своем первом сообщении. Обычно ваше предложение должно сработать. Но, к сожалению, это не так:2. @s950mpc2000: Куда и как вы вызываете
WriteLeftMarginInConsole()
вMainWindow
? Вам нужно будет вызвать его после того, как вы зададите свойстваCanvas
.3.Я написал
public void WriteLeftMarginInConsole()
{
Console.WriteLine(dragCanvas_.TopMargin);
}
в качестве последнего метода MainWindow.xaml.cs, то есть в конце MainWindow.xaml.cs-файла.4. @s950mpc2000: Но как и где вы вызываете это? Он не вызывает сам себя…
5. @s950mpc2000: Отлично. Не стесняйтесь задавать новый вопрос, если у вас есть другая проблема.