分享至
  • {{item.text}}
  • 本站大部分功能不支持IE浏览器,请使用谷歌内核的浏览器进行访问。

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

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

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

1. 桌面截屏控件的实现的思路

一直以来很好奇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>