WPF实现窗体中的悬浮按钮
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实现窗体中的悬浮按钮的更多相关文章
- 您的位置:首页 » IOS » iOS中全局悬浮按钮,类似IPhone中的AssistiveTouch iOS中全局悬浮按钮,类似IPhone中的AssistiveTouch
原文地址:http://blog.5ibc.net/p/86562.html 前提:当时看到别人写过这个类似AssistiveTouch的demo,但是有问题,第一改变不了位置.第二切换页面后无法使用 ...
- Delphi窗体中禁用最大化按钮
第一种方法是设置窗体的BorderIcons/biMaximize属性为False,这种方法仅让窗体的最大化按钮灰掉: 第二种方法是设置窗体的BorderStyle属性为bsDialog,这种方法使最 ...
- wpf 透明窗体中使用webbrowser
wpf ,PNG图形半透明窗体 ,使用webbrowser控件 附件:http://files.cnblogs.com/xe2011/WpfApplication1_webbrowser_tran ...
- WPF MVVM模式中,通过命令实现窗体拖动、跳转以及显隐控制
原文:WPF MVVM模式中,通过命令实现窗体拖动.跳转以及显隐控制 在WPF中使用MVVM模式,可以让我们的程序实现界面与功能的分离,方便开发,易于维护.但是,很多初学者会在使用MVVM的过程中遇到 ...
- WPF子窗体
效果: 1. 点击WPF主窗体上的一个按钮,弹出子窗体, 2. 窗体最小化后,在菜单栏中点击子窗体,会连带显示它所从属的主窗体. 1. 在WPF项目中,已有主窗体MainWindow,再新建子窗体Ch ...
- winfrom窗体中嵌套WPF控件
前言 本文主要介绍如何在winfrom窗体中嵌套WPF控件, 一来是自己记录一下,而来希望能对有需要的朋友提供实现思路. 如有错误请指出...下面进入正题... -1.前期准备 准备一个建立好的win ...
- 关于WinForm引用WPF窗体---在Winform窗体中使用WPF控件
项目中有个界面展示用WPF实现起来比较简单,并且能提供更酷炫的效果,但是在WinForm中使用WPF窗体出现了问题,在网上找了一下有些人说Winform不能引用WPF的窗体,我就很纳闷,Win32都能 ...
- WPF Prism MVVM 中 弹出新窗体. 放入用户控件
原文:WPF Prism MVVM 中 弹出新窗体. 放入用户控件 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/qq_37214567/artic ...
- 在WPF窗体中重绘
原文:在WPF窗体中重绘 写这篇主要是为了验证任何元素自身都具备绘图功能. 在默认Window中重写OnRender方法 protected override void OnRender(Draw ...
随机推荐
- 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 ...
- base64编码是什么1
首先明确一点base64 是一种编码格式.就想UNICODE一样,能在电脑上表示所有字符,或者换句话说通过编码能让电脑理解你想要表示的字符(因为电脑只知道0和1 ) 就像ascII 中 0100 00 ...
- Flex DateTime Format
mx.formatter.DateFormatter var df:DateFormatter = new DateFormatter(); df.formatString = "YYYY- ...
- 【NIFI】 开发自定义Nifi Processor
本例需要基础知识:[NIFI] Apache NiFI 安装及简单的使用 Nifi不光可以使用自带的Processor,还可以自定义Processor.本例简单介绍开发一个Processor 开发 1 ...
- 计算器的改良(NOIP2000)
题目链接:计算器的改良 这道题,不是很难,但代码也短不到哪去. 我们这里决定采取边读入边计算的方法,因为题目没有明确说式子有多长. 我们需要计算什么? 我们需要知道等号两边未知数的系数和常数项即可. ...
- 爬取微博的数据时别人用的是FM.view方法传递html标签那么jsoup怎么解析呢
使用JSOUP就行 这里给出点思路 我只做了自己的首页和其他人的微博首页的抓取 其他的抓取没尝试(不好意思 比较懒...) 首先是利用JSOUP进行登陆 获取页面 看了下微博的登陆表格 发现用了aja ...
- Codeforces gym 102062 简要题解
文章目录 A. Bob and BoB B. Vibranium Gift C. The Blood Moon D. Palindrome and Chocolate E. Jumpy Robot F ...
- aliyun API 调试
打开https://ai.aliyun.com/,登录阿里云账号,选择控制台,右侧标签中选择产品服务,选择自己需要的子标签(如图像识别),选择API调试,按要求填写表格. 其中请求Body参照API文 ...
- C#-vs2012学习笔记-惊奇于vs的强大和便利
网站常用功能自动完成,包括网页和数据库.
- 用 gdb 调试 GCC 程序
Linux 包含了一个叫 gdb 的 GNU 调试程序. gdb 是一个用来调试 C 和 C++ 程序的强力调试器. 它使你能在程序运行时观察程序的内部结构和内存的使用情况. 以下是 gdb 所提供的 ...