Проблемы с получением значений двух переменных из класса DragCanvas_ внутри другого cs-файла проекта C #.Это ошибка DragCanvas?

#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: Отлично. Не стесняйтесь задавать новый вопрос, если у вас есть другая проблема.