『QQ:1353814576』

WPF桌面截图控件的实现以及RichTextBox实现支持MVVM绑定数据源


WPF文本框控件RichTextBox实现MVVM绑定数据源

前些日子又开发了一款windows离线版的桌面截图ocr识别软件(TK截屏精灵)来解决自己的一些需求(主要是网上的基本都是需要联网或者限制使用次数的),界面基于wpf实现了桌面截图框选功能,功能做的非常简单,除了内存占用比较高之外(毕竟是离线的 识别速度快慢也和本机配置直接挂钩)平时用着感觉还挺好用的,开发过程比较有记录价值的有两点。

1. 桌面截屏控件的实现的思路(右侧有相关wpf源码下载)

一直以来很好奇qq桌面截图之类的功能是怎么实现的,就是那种点击快捷按键屏幕就会变全屏灰色遮罩,然后周边框选的矩形区域显示原来的颜色的效果即需要框选的区域。

这里记一下wpf下大致实现思路(想通了其实也很简单): 首先创建一个透明遮罩窗体(可通过快捷键唤起),其上四遍各放置一个矩形遮罩控件填充黑色 并设置透明色实际框,通过鼠标坐标点控制遮罩的宽高,选区域其实就是四个遮罩控件中间的暴露区域,通过调节四个个矩形的大小就可以相应的控制中间截图区域的位置和大小,以下是实现的效果

WPF文本框控件RichTextBox实现MVVM绑定数据源

2. RichTextBox实现MVVM绑定的方法实现

WPF里的RichTextBox控件本身是不支持MVVM绑定的,通过以下代码即可实现

public class RichTextBoxHelper : DependencyObject
    {
        public static string GetRichText(DependencyObject obj)
        {
            return (string)obj.GetValue(RichTextProperty);
        }

        public static void SetRichText(DependencyObject obj, string value)
        {
            obj.SetValue(RichTextProperty, value);
        }
        public static readonly DependencyProperty RichTextProperty =
            DependencyProperty.RegisterAttached("RichText", typeof(string), typeof(RichTextBoxHelper), new FrameworkPropertyMetadata
            {
                BindsTwoWayByDefault = true,
                PropertyChangedCallback = (obj, e) =>
                {
                    var richTextBox = (RichTextBox)obj;
                    var text = GetRichText(richTextBox);
                    richTextBox.AppendText(text);
                    richTextBox.AppendText(Environment.NewLine);
                    richTextBox.ScrollToEnd();
                }

            });
    }

XMAL 页面使用

<RichTextBox VerticalScrollBarVisibility="Auto"  Grid.Column="1"  common:RichTextBoxHelper.RichText="{Binding  Model.Text,Mode=TwoWay}" Style="{StaticResource ImageTextBox}" ></RichTextBox>