栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C# > C#教程

WPF实现窗体中的悬浮按钮

C#教程 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

WPF实现窗体中的悬浮按钮

WPF实现窗体中的悬浮按钮,按钮可拖动,吸附停靠在窗体边缘。

控件XAML代码:

控件cs代码:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;

namespace SunCreate.Common.Controls
{
  /// 
  /// 悬浮按钮
  /// 
  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 left = parent.ActualWidth - this.ActualWidth - this._distanceNew;
 double top = parent.ActualHeight - this.ActualHeight - this._distanceNew;
 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;

 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 = e.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 btn_Click(object sender, RoutedEventArgs e)
    {
      if (_newPos.Equals(_oldPos))
      {
 if (ClickEvent != null)
 {
   ClickEvent(sender, e);
 }
      }
    }
  }
}

如何使用:


  
    
  

效果图:

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持考高分网。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/122732.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号