WPF 截图控件之文字(七)「仿微信」
前言
接着上周写的截图控件继续更新添加 文字。
1.WPF实现截屏「仿微信」
2.WPF 实现截屏控件之移动(二)「仿微信」
3.WPF 截图控件之伸缩(三) 「仿微信」
4.WPF 截图控件之绘制方框与椭圆(四) 「仿微信」
5.WPF 截图控件之绘制箭头(五)「仿微信」
6.WPF 截图控件之绘制箭头禁止越界(六)「仿微信」
正文
一、接着ScreenCut继续发电。
1)添加文字操作只允许在可编辑区域内
- 在添加文字、使用
Border嵌套TextBox
Border需注意:
1)当控件的高存放不下内容的时候需要将控件的SetTop设置向上移动,最大不能超过Rect的Top 需要监听宽高发生变化SizeChanged
TextBox需注意:
1)需要监听失去光标焦点LostKeyboardFocus后找TextBox的父控件设置边框为零。


void DrawText()
{
if (pointStart.Value.X < rect.Right
&&
pointStart.Value.X > rect.Left
&&
pointStart.Value.Y > rect.Top
&&
pointStart.Value.Y < rect.Bottom)
{
var currentWAndX = pointStart.Value.X + 40;
if (textBorder == null)
{
textBorder = new Border
{
BorderBrush = _currentBrush == null ? Brushes.Red : _currentBrush,
BorderThickness = new Thickness(1),
Tag = _tag
};
var textBox = new TextBox();
textBox.Style = null;
textBox.Background = null;
textBox.BorderThickness = new Thickness(0);
textBox.Foreground = textBorder.BorderBrush;
textBox.FontFamily = DrawingContextHelper.FontFamily;
textBox.FontSize = 16;
textBox.TextWrapping = TextWrapping.Wrap;
textBox.FontWeight = FontWeights.Bold;
textBox.MinWidth = _width;
textBox.MaxWidth = rect.Right - pointStart.Value.X;
textBox.MaxHeight = rect.Height;
textBox.Cursor = Cursors.Hand;
textBox.Padding = new Thickness(4);
textBox.LostKeyboardFocus += (s, e1) =>
{
var tb = s as TextBox;
var parent = VisualTreeHelper.GetParent(tb);
if (parent != null && parent is Border border)
{
border.BorderThickness = new Thickness(0);
if (string.IsNullOrWhiteSpace(tb.Text))
_canvas.Children.Remove(border);
}
};
textBorder.SizeChanged += (s, e1) =>
{
var tb = s as Border;
var y = y1;
if (y + tb.ActualHeight > rect.Bottom)
{
var v = Math.Abs(rect.Bottom - (y + tb.ActualHeight));
y1 = y - v;
Canvas.SetTop(tb, y1);
}
};
textBorder.PreviewMouseLeftButtonDown += (s, e) =>
{
SelectElement();
var border = s as Border;
border.BorderThickness = new Thickness(1);
frameworkElement = border;
frameworkElement.Opacity = .7;
};
textBorder.Child = textBox;
_canvas.Children.Add(textBorder);
textBox.Focus();
var x = pointStart.Value.X;
if (currentWAndX > rect.Right)
x = x - (currentWAndX - rect.Right);
Canvas.SetLeft(textBorder, x);
Canvas.SetTop(textBorder, pointStart.Value.Y);
}
}
}
2)移除焦点 。
Keyboard.ClearFocus();
完整代码如下

项目地址
WPF 截图控件之文字(七)「仿微信」的更多相关文章
- WPF 截图控件之画笔(八)「仿微信」
前言 接着上周写的截图控件继续更新添加 画笔. 1.WPF实现截屏「仿微信」 2.WPF 实现截屏控件之移动(二)「仿微信」 3.WPF 截图控件之伸缩(三) 「仿微信」 4.WPF 截图控件之绘制方 ...
- WPF 截图控件之移除控件(九)「仿微信」
WPF 截图控件之移除控件(九)「仿微信」 WPF 截图控件之移除控件(九)「仿微信」 作者:WPFDevelopersOrg 原文链接: https://github.com/WPFDevelope ...
- WPF 截图控件之绘制方框与椭圆(四) 「仿微信」
前言 接着上周写的截图控件继续更新 绘制方框与椭圆. 1.WPF实现截屏「仿微信」 2.WPF 实现截屏控件之移动(二)「仿微信」 3.WPF 截图控件之伸缩(三) 「仿微信」 正文 有开发者在B站反 ...
- WPF 截图控件之绘制箭头(五)「仿微信」
前言 接着上周写的截图控件继续更新 绘制箭头. 1.WPF实现截屏「仿微信」 2.WPF 实现截屏控件之移动(二)「仿微信」 3.WPF 截图控件之伸缩(三) 「仿微信」 4.WPF 截图控件之绘制方 ...
- WPF TextBox控件中文字实现垂直居中
TextBox纵向长度比较长但文字字体比较小的时候,在输入时就会发现文字不是垂直居中的. 而使用中我们发现,TextBox虽然可以设置文字的水平对齐方式,但却没有相应的属性让我们来调节他的垂直对齐方式 ...
- WPF常用控件应用demo
WPF常用控件应用demo 一.Demo 1.Demo截图如下: 2.demo实现过程 总体布局:因放大缩小窗体,控件很根据空间是否足够改变布局,故用WrapPanel布局. <ScrollVi ...
- WPF DataGrid 控件的运用
WPF DataGrid 控件的运用 运行环境:Window7 64bit,.NetFramework4.61,C# 6.0: 编者:乌龙哈里 2017-02-23 参考: King Cobra 博客 ...
- 示例:自定义WPF底层控件UI库 HeBianGu.General.WpfControlLib V2.0版本
原文:示例:自定义WPF底层控件UI库 HeBianGu.General.WpfControlLib V2.0版本 一.目的:封装了一些控件到自定义的控件库中,方便快速开发 二.实现功能: 基本实现常 ...
- WPF开源控件扩展库 - MaterialDesignExtensions
Material Design Extensions 在WPF开源控件库 Material Design in XAML Toolkit(本站介绍:链接)的基础上进行了控件扩展和特性新增.本开源项目中 ...
随机推荐
- 干掉RedisHelper,请这样用分布式缓存
前言 我们在项目中使用Redis时通常是写一个单例模式的RedisHelper静态类,暴露一些常用的Get.Set等操作,在需要使用地方直接RedisHelper.StringGet(xx,xx)就可 ...
- 记一次IIS网站启动不了的问题排查
今天清理了下机器中的IIS网站,将很久不用的网站都删除. 因为需要删除的比较多,正在使用的很少,就将网站全部删除了,然后准备重新添加需要用的. 在添加了网站后,点击启动按钮,发现网站启动不了,因为网站 ...
- 深度学习与CV教程(4) | 神经网络与反向传播
作者:韩信子@ShowMeAI 教程地址:http://www.showmeai.tech/tutorials/37 本文地址:http://www.showmeai.tech/article-det ...
- Flask 之 高可用IP代理网站
高可用代理IP网站 目标:提供高可用代理IP 步骤一:通过爬虫获取代理IP 步骤二:对代理IP进行检测,判断代理是否可用 步骤三:将可用的代理IP写入mongodb数据库 步骤四:创建网站,从数据库获 ...
- C#语言中的类型转换方法(unfinished)
一.C#中的数据类型 1.数值类型 2.字符类型 3.字符串类型 4.布尔类型 5.枚举类型 6.Object类型 二.常见的类型转换 从转换方式的角度,类型转换分为隐式转换与显式转换两种. 其中,隐 ...
- 【原创】快速理解Unicode和utf-8的本质
字符串编码 基本概念 在代码中处理,为了字节统一,都统一使用Unicode 核心:在pyhton中s.encode("utf-8")中的变量实例s必须是已经是Unicode格式,否 ...
- Python装饰器Decorators
def hi(name="yasoob"): return "hi " + name print(hi()) # 我们甚至可以将一个函数赋值给一个变量,比如 g ...
- 7. Docker CI、CD
在上图这个新建的docker-compose.yml文件中把刚才的代码粘贴进去. 可把上述文件保存后,然后到/etc/ssh/sshd_config文件中更改下对应的端口号即可. 然后重新启动sshd ...
- mac mini 装UBUNTU后没有WIFI解决办法
1.在终端中运行如下命令,重新安装b43相关的全部驱动和firmware: 复制代码 代码如下: sudo apt-get install bcmwl-kernel-source #Broadcom ...
- 面试突击58:truncate、delete和drop的6大区别
在 MySQL 中,使用 truncate.delete 和 drop 都可以实现表删除,但它们 3 个的使用场景和执行效果完全不同,接下来我们来盘点一下. truncate.delete.drop区 ...