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

控件XAML代码:

<Button x:Class="SunCreate.Common.Controls.FloatButton"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
mc:Ignorable="d"
d:DesignHeight="300" d:DesignWidth="300"
Width="50" Height="50" Margin="0"
HorizontalAlignment="Left" VerticalAlignment="Top"
x:Name="btn"
Loaded="btn_Loaded" Click="btn_Click" >
<Button.Template>
<ControlTemplate>
<Grid MouseLeftButtonDown="Border_MouseLeftButtonDown">
<Border CornerRadius="25" Background="#022938" Opacity="0.2" >
</Border>
<Border CornerRadius="20" Width="40" Height="40" Background="#022938" Opacity="0.3" >
</Border>
<Border CornerRadius="14" Width="28" Height="28" Background="#b06919" Opacity="0.8" >
</Border>
</Grid>
</ControlTemplate>
</Button.Template>
</Button>

控件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
{
/// <summary>
/// 悬浮按钮
/// </summary>
public partial class FloatButton : Button
{
public event EventHandler ClickEvent; private bool _move = false;
double _distance = ;
double _distanceNew = ;
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 = parent.ActualWidth - this.ActualWidth - this._distanceNew;
double top1 = parent.ActualHeight - this.ActualHeight - this._distanceNew;
this.Margin = new Thickness(left1, top1, , ); 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, , ); _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, , );
marginAnimation.Duration = TimeSpan.FromMilliseconds(); 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, , );
}
};
}
} 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);
}
}
}
}
}

如何使用:

<Window
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:ui="clr-namespace:SunCreate.Common.Controls;assembly=SunCreate.Common.Controls"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" mc:Ignorable="d" x:Class="SunCreate.Common.Controls.Demo.MainWindow"
Title="MainWindow"
Height="700" Width="1200"
Background="#ff10498c"
WindowStartupLocation="CenterScreen">
<Grid>
<ui:FloatButton x:Name="floatBtn" ></ui:FloatButton>
</Grid>
</Window>

效果图:

WPF实现窗体中的悬浮按钮的更多相关文章

  1. 您的位置:首页 » IOS » iOS中全局悬浮按钮,类似IPhone中的AssistiveTouch iOS中全局悬浮按钮,类似IPhone中的AssistiveTouch

    原文地址:http://blog.5ibc.net/p/86562.html 前提:当时看到别人写过这个类似AssistiveTouch的demo,但是有问题,第一改变不了位置.第二切换页面后无法使用 ...

  2. Delphi窗体中禁用最大化按钮

    第一种方法是设置窗体的BorderIcons/biMaximize属性为False,这种方法仅让窗体的最大化按钮灰掉: 第二种方法是设置窗体的BorderStyle属性为bsDialog,这种方法使最 ...

  3. wpf 透明窗体中使用webbrowser

    wpf ,PNG图形半透明窗体 ,使用webbrowser控件   附件:http://files.cnblogs.com/xe2011/WpfApplication1_webbrowser_tran ...

  4. WPF MVVM模式中,通过命令实现窗体拖动、跳转以及显隐控制

    原文:WPF MVVM模式中,通过命令实现窗体拖动.跳转以及显隐控制 在WPF中使用MVVM模式,可以让我们的程序实现界面与功能的分离,方便开发,易于维护.但是,很多初学者会在使用MVVM的过程中遇到 ...

  5. WPF子窗体

    效果: 1. 点击WPF主窗体上的一个按钮,弹出子窗体, 2. 窗体最小化后,在菜单栏中点击子窗体,会连带显示它所从属的主窗体. 1. 在WPF项目中,已有主窗体MainWindow,再新建子窗体Ch ...

  6. winfrom窗体中嵌套WPF控件

    前言 本文主要介绍如何在winfrom窗体中嵌套WPF控件, 一来是自己记录一下,而来希望能对有需要的朋友提供实现思路. 如有错误请指出...下面进入正题... -1.前期准备 准备一个建立好的win ...

  7. 关于WinForm引用WPF窗体---在Winform窗体中使用WPF控件

    项目中有个界面展示用WPF实现起来比较简单,并且能提供更酷炫的效果,但是在WinForm中使用WPF窗体出现了问题,在网上找了一下有些人说Winform不能引用WPF的窗体,我就很纳闷,Win32都能 ...

  8. WPF Prism MVVM 中 弹出新窗体. 放入用户控件

    原文:WPF Prism MVVM 中 弹出新窗体. 放入用户控件 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/qq_37214567/artic ...

  9. 在WPF窗体中重绘

    原文:在WPF窗体中重绘   写这篇主要是为了验证任何元素自身都具备绘图功能. 在默认Window中重写OnRender方法 protected override void OnRender(Draw ...

随机推荐

  1. Pairs of Songs With Total Durations Divisible by 60 LT1010

    In a list of songs, the i-th song has a duration of time[i] seconds. Return the number of pairs of s ...

  2. base64编码是什么1

    首先明确一点base64 是一种编码格式.就想UNICODE一样,能在电脑上表示所有字符,或者换句话说通过编码能让电脑理解你想要表示的字符(因为电脑只知道0和1 ) 就像ascII 中 0100 00 ...

  3. Flex DateTime Format

    mx.formatter.DateFormatter var df:DateFormatter = new DateFormatter(); df.formatString = "YYYY- ...

  4. 【NIFI】 开发自定义Nifi Processor

    本例需要基础知识:[NIFI] Apache NiFI 安装及简单的使用 Nifi不光可以使用自带的Processor,还可以自定义Processor.本例简单介绍开发一个Processor 开发 1 ...

  5. 计算器的改良(NOIP2000)

    题目链接:计算器的改良 这道题,不是很难,但代码也短不到哪去. 我们这里决定采取边读入边计算的方法,因为题目没有明确说式子有多长. 我们需要计算什么? 我们需要知道等号两边未知数的系数和常数项即可. ...

  6. 爬取微博的数据时别人用的是FM.view方法传递html标签那么jsoup怎么解析呢

    使用JSOUP就行 这里给出点思路 我只做了自己的首页和其他人的微博首页的抓取 其他的抓取没尝试(不好意思 比较懒...) 首先是利用JSOUP进行登陆 获取页面 看了下微博的登陆表格 发现用了aja ...

  7. Codeforces gym 102062 简要题解

    文章目录 A. Bob and BoB B. Vibranium Gift C. The Blood Moon D. Palindrome and Chocolate E. Jumpy Robot F ...

  8. aliyun API 调试

    打开https://ai.aliyun.com/,登录阿里云账号,选择控制台,右侧标签中选择产品服务,选择自己需要的子标签(如图像识别),选择API调试,按要求填写表格. 其中请求Body参照API文 ...

  9. C#-vs2012学习笔记-惊奇于vs的强大和便利

    网站常用功能自动完成,包括网页和数据库.

  10. 用 gdb 调试 GCC 程序

    Linux 包含了一个叫 gdb 的 GNU 调试程序. gdb 是一个用来调试 C 和 C++ 程序的强力调试器. 它使你能在程序运行时观察程序的内部结构和内存的使用情况. 以下是 gdb 所提供的 ...