Странная ситуация с ссылкой this

483
06 сентября 2017, 12:09

Привет всем, скажите пожалуйста почему в событии MouseMove объекта не работает такая конструкция

Point p = new Point(Canvas.GetLeft(this),Canvas.GetTop(this));

public class RouteElement : UIElement { public string address{get; set;}

    List<RouteElement> save_list;
    public PortLink port { get; set; }
    public List<PortLink> destination_ports;
    public string ip { get; set; }
    bool canmove = false;
    public Point elem_coord { get; set; }      
    Image icon = null;
    public List<Line> connection_lines { get; set; }        
    MainWindow mw;
    public RouteElement(string address, string ip, MainWindow mw)
    {
        save_list = new List<RouteElement>();
        destination_ports = new List<PortLink>();
        port = new PortLink();
        this.mw = mw;          
        connection_lines = new List<Line>();
        this.address = address; this.ip = ip;                      
        BitmapImage bmp = new BitmapImage();
        icon = new Image();
        bmp.BeginInit();
        bmp.UriSource = new Uri("Images/house-png-202.png",UriKind.Relative);
        bmp.EndInit();
        icon.Source = bmp;
        icon.Height = 30;
        icon.Width = 30;
    }
    public RouteElement( MainWindow mw) 
    {
        this.mw = mw;
        port = new PortLink();
        destination_ports = new List<PortLink>();
        connection_lines = new List<Line>();
        save_list = new List<RouteElement>();
        BitmapImage bmp = new BitmapImage();
        icon = new Image();
        bmp.BeginInit();
        bmp.UriSource = new Uri("Images/house-png-202.png", UriKind.Relative);
        bmp.EndInit();
        icon.Source = bmp;
        icon.Height = 30;
        icon.Width = 30;
    }
    public Border Show_Element()
    {
        Border container = new Border();
        container.Cursor = Cursors.Hand;
        Border info_frame = new Border();
        info_frame.Opacity = 0.3;
        info_frame.Background = Brushes.Wheat;
        info_frame.MouseEnter += new MouseEventHandler(info_frame_MouseEnter);
        info_frame.MouseLeave += new MouseEventHandler(info_frame_MouseLeave);
        StackPanel stk1 = new StackPanel();
        info_frame.Child = stk1;                     
        TextBlock tb1 = new TextBlock();
        tb1.Text = address;
        tb1.TextAlignment = TextAlignment.Center;
        TextBlock tb2 = new TextBlock();
        tb2.Text = ip;
        tb2.TextAlignment = TextAlignment.Center;
        StackPanel stk2 = new StackPanel();            
        stk2.Children.Add(icon);
        stk2.Children.Add(info_frame);
        stk1.Children.Add(tb1);
        stk1.Children.Add(tb2);
        container.Child = stk2;
        container.Width = 100;
        container.Height = 100;
        container.CornerRadius = new CornerRadius(5);
       // container.BorderThickness = new Thickness(1);
        container.BorderBrush = Brushes.Black;
        container.MouseUp += new MouseButtonEventHandler(container_MouseUp);
        container.MouseEnter += new MouseEventHandler(container_MouseEnter);
        container.MouseLeave += new MouseEventHandler(container_MouseLeave);
        container.PreviewMouseDown += new MouseButtonEventHandler(container_PreviewMouseDown);
        container.PreviewMouseUp += new MouseButtonEventHandler(container_PreviewMouseUp);
        container.PreviewMouseMove += new MouseEventHandler(container_PreviewMouseMove);
        return container;
    }
    void info_frame_MouseLeave(object sender, MouseEventArgs e)
    {
        DoubleAnimation da = new DoubleAnimation();
        da.To = 0.3;
        da.Duration = new Duration(TimeSpan.FromSeconds(0.2));
        da.BeginAnimation(Border.OpacityProperty, da);
    }
    void info_frame_MouseEnter(object sender, MouseEventArgs e)
    {
        DoubleAnimation da = new DoubleAnimation();
        da.To = 1;
        da.Duration = new Duration(TimeSpan.FromSeconds(0.2));
        da.BeginAnimation(Border.OpacityProperty, da);
    }
    void container_MouseUp(object sender, MouseButtonEventArgs e)
    {
        if (Keyboard.IsKeyDown(Key.LeftCtrl))
        {
            Border re = sender as Border;
            mw.pair.Add(this);
            mw.con.points.Add(new Point(Canvas.GetLeft(re), Canvas.GetTop(re)));
            elem_coord = new Point(Canvas.GetLeft(re), Canvas.GetTop(re));
            mw.con.route_obj.Add(this);
            if (mw.con.route_obj.Count == 2)
            {
                 mw.con.connect_elements(re);
            }

        }
    }
    void container_PreviewMouseMove(object sender, MouseEventArgs e)
    {
        Border re = sender as Border;
        if (canmove)
        {
            re.SetValue(Canvas.LeftProperty, e.GetPosition(null).X - elem_coord.X-5);
            re.SetValue(Canvas.TopProperty, e.GetPosition(null).Y - elem_coord.Y-5);
            Point p = new Point(Canvas.GetLeft(re),Canvas.GetTop(re));
            mw.con.p = p;
            mw.con.route_obj_ = this;
            //mw.con.update_connection_lines(re);
            //здесь баг таится
            if (this.connection_lines != null)
            {
                foreach (var item in this.connection_lines)
                {
                    MessageBox.Show(item.X1.ToString()+" "+p.X.ToString());
                    MessageBox.Show(item.Y1.ToString() + " " + p.Y.ToString());
                    if (item.X1 == p.X - re.Width/2 && item.Y1 == p.Y - re.Height/2)
                    {
                        MessageBox.Show("первое условие по Х1, Y1");
                    }
                    else if (item.X2 == p.X - re.Width / 2 && item.Y2 == p.Y - re.Height / 2)
                    {
                        MessageBox.Show("второе условие по Х2, Y2");
                    }
                }
             }
         }
    }
    void container_PreviewMouseUp(object sender, MouseButtonEventArgs e)
    {
        Mouse.Capture(null);
        canmove = false;
    }
    void container_PreviewMouseDown(object sender, MouseButtonEventArgs e)
    {
        Border b = sender as Border;
        Mouse.Capture(b);
        elem_coord = Mouse.GetPosition(b);
        canmove = true;

    }
    void container_MouseLeave(object sender, MouseEventArgs e)
    {
    }
    void container_MouseEnter(object sender, MouseEventArgs e)
    {
    }        
}

}

Answer 1

Вы устанавливаете свойство неправильно:

re.SetValue(Canvas.LeftProperty, ...);

Вместо этого попробуйте

Canvas.SetLeft(re, ...);
READ ALSO
Почему долго открывается форма?

Почему долго открывается форма?

При нажатии на меню проходит порядка 5-8 сек, хотя с остальными формами все нормПочему долго открывается форма ?

262
Уничтожение объекта, как условие Unity, C# [требует правки]

Уничтожение объекта, как условие Unity, C# [требует правки]

"Если объект уничтожен, то выполняется условие" - вот этот когда надо сделать, но понять, как реализовать, я не могу

259
Xamarin бесплатен?

Xamarin бесплатен?

Можно ли использовать Xamarin бесплатно делая на нём коммерческие программы?

389