You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							150 lines
						
					
					
						
							6.1 KiB
						
					
					
				
			
		
		
	
	
							150 lines
						
					
					
						
							6.1 KiB
						
					
					
				using System; | 
						|
using System.Windows; | 
						|
using System.Windows.Controls; | 
						|
using System.Windows.Input; | 
						|
using System.Windows.Media.Animation; | 
						|
 | 
						|
namespace Kingo.Plugin.MapView.Views.FeatureAttribute | 
						|
{ | 
						|
    /// <summary> | 
						|
    /// 悬浮按钮 | 
						|
    /// </summary> | 
						|
    public partial class FloatButton : Button | 
						|
    { | 
						|
        public event EventHandler ClickEvent; | 
						|
 | 
						|
        private bool _move = false; | 
						|
        double _distance = 200; | 
						|
        double _distanceNew = 5; | 
						|
        private Point _lastPos; | 
						|
        private Point _newPos; | 
						|
        private Point _oldPos; | 
						|
 | 
						|
        public FloatButton() | 
						|
        { | 
						|
            InitializeComponent(); | 
						|
        } | 
						|
 | 
						|
        private void btn_Loaded(object sender, RoutedEventArgs e) | 
						|
        { | 
						|
            if (this.Parent != null && this.Parent is FrameworkElement) | 
						|
            { | 
						|
                FrameworkElement parent = this.Parent as FrameworkElement; | 
						|
                double left1 = 0; //parent.ActualWidth - this.ActualWidth - this._distanceNew; | 
						|
                double top1 = 0;// parent.ActualHeight - this.ActualHeight - this._distanceNew; | 
						|
                this.Margin = new Thickness(left1, top1, 0, 0); | 
						|
                parent.PreviewMouseMove += (s, ee) => | 
						|
                { | 
						|
                    if (_move) | 
						|
                    { | 
						|
                        Point pos = ee.GetPosition(parent); | 
						|
                        double left = this.Margin.Left + pos.X - this._lastPos.X; | 
						|
                        double top = this.Margin.Top + pos.Y - this._lastPos.Y; | 
						|
                        this.Margin = new Thickness(left, top, 0, 0); | 
						|
 | 
						|
                        _lastPos = ee.GetPosition(parent); | 
						|
                    } | 
						|
                }; | 
						|
 | 
						|
                parent.PreviewMouseUp += (s, ee) => | 
						|
                { | 
						|
                    if (_move) | 
						|
                    { | 
						|
                        _move = false; | 
						|
 | 
						|
                        Point pos = ee.GetPosition(parent); | 
						|
                        _newPos = pos; | 
						|
                        double left = this.Margin.Left + pos.X - this._lastPos.X; | 
						|
                        double top = this.Margin.Top + pos.Y - this._lastPos.Y; | 
						|
                        double right = parent.ActualWidth - left - this.ActualWidth; | 
						|
                        double bottom = parent.ActualHeight - top - this.ActualHeight; | 
						|
 | 
						|
                        if (left < _distance && top < _distance) //左上 | 
						|
                        { | 
						|
                            left = this._distanceNew; | 
						|
                            top = this._distanceNew; | 
						|
                        } | 
						|
                        else if (left < _distance && bottom < _distance) //左下 | 
						|
                        { | 
						|
                            left = this._distanceNew; | 
						|
                            top = parent.ActualHeight - this.ActualHeight - this._distanceNew; | 
						|
                        } | 
						|
                        else if (right < _distance && top < _distance) //右上 | 
						|
                        { | 
						|
                            left = parent.ActualWidth - this.ActualWidth - this._distanceNew; | 
						|
                            top = this._distanceNew; | 
						|
                        } | 
						|
                        else if (right < _distance && bottom < _distance) //右下 | 
						|
                        { | 
						|
                            left = parent.ActualWidth - this.ActualWidth - this._distanceNew; | 
						|
                            top = parent.ActualHeight - this.ActualHeight - this._distanceNew; | 
						|
                        } | 
						|
                        else if (left < _distance && top > _distance && bottom > _distance) //左 | 
						|
                        { | 
						|
                            left = this._distanceNew; | 
						|
                            top = this.Margin.Top; | 
						|
                        } | 
						|
                        else if (right < _distance && top > _distance && bottom > _distance) //右 | 
						|
                        { | 
						|
                            left = parent.ActualWidth - this.ActualWidth - this._distanceNew; | 
						|
                            top = this.Margin.Top; | 
						|
                        } | 
						|
                        else if (top < _distance && left > _distance && right > _distance) //上 | 
						|
                        { | 
						|
                            left = this.Margin.Left; | 
						|
                            top = this._distanceNew; | 
						|
                        } | 
						|
                        else if (bottom < _distance && left > _distance && right > _distance) //下 | 
						|
                        { | 
						|
                            left = this.Margin.Left; | 
						|
                            top = parent.ActualHeight - this.ActualHeight - this._distanceNew; | 
						|
                        } | 
						|
 | 
						|
                        ThicknessAnimation marginAnimation = new ThicknessAnimation(); | 
						|
                        marginAnimation.From = this.Margin; | 
						|
                        marginAnimation.To = new Thickness(left, top, 0, 0); | 
						|
                        marginAnimation.Duration = TimeSpan.FromMilliseconds(200); | 
						|
 | 
						|
                        Storyboard story = new Storyboard(); | 
						|
                        story.FillBehavior = FillBehavior.Stop; | 
						|
                        story.Children.Add(marginAnimation); | 
						|
                        Storyboard.SetTargetName(marginAnimation, "btn"); | 
						|
                        Storyboard.SetTargetProperty(marginAnimation, new PropertyPath("(0)", Border.MarginProperty)); | 
						|
 | 
						|
                        story.Begin(this); | 
						|
 | 
						|
                        this.Margin = new Thickness(left, top, 0, 0); | 
						|
                    } | 
						|
                }; | 
						|
            } | 
						|
        } | 
						|
 | 
						|
        private void Border_MouseLeftButtonDown(object sender, MouseButtonEventArgs e) | 
						|
        { | 
						|
            if (this.Parent != null && this.Parent is FrameworkElement) | 
						|
            { | 
						|
                FrameworkElement parent = this.Parent as FrameworkElement; | 
						|
                _move = true; | 
						|
                _lastPos = e.GetPosition(parent); | 
						|
                _oldPos = _lastPos; | 
						|
            } | 
						|
        } | 
						|
 | 
						|
        private void btn_Click(object sender, RoutedEventArgs e) | 
						|
        { | 
						|
            if (_newPos.Equals(_oldPos)) | 
						|
            { | 
						|
                if (ClickEvent != null) | 
						|
                { | 
						|
                    ClickEvent(sender, e); | 
						|
                } | 
						|
            } | 
						|
        } | 
						|
 | 
						|
        private void Btn_MouseDoubleClick(object sender, MouseButtonEventArgs e) | 
						|
        { | 
						|
            FrmDataCheck frmDataCheck = new FrmDataCheck(); | 
						|
            frmDataCheck.ShowPanel(); | 
						|
        } | 
						|
    } | 
						|
}
 | 
						|
 |