Notes

Форк
0
/
RichTextBoxHelper.cs 
75 строк · 2.5 Кб
1
using System;
2
using System.Collections.Generic;
3
using System.Globalization;
4
using System.IO;
5
using System.Linq;
6
using System.Text;
7
using System.Threading;
8
using System.Threading.Tasks;
9
using System.Windows;
10
using System.Windows.Controls;
11
using System.Windows.Data;
12
using System.Windows.Documents;
13
using System.Windows.Markup;
14

15
namespace ViewModel.Services
16
{
17
    public class RichTextBoxHelper : DependencyObject
18
    {
19
        private static HashSet<Thread> _recursionProtection = new HashSet<Thread>();
20

21
        public static string GetDocumentXaml(DependencyObject obj)
22
        {
23
            return (string)obj.GetValue(DocumentXamlProperty);
24
        }
25

26
        public static void SetDocumentXaml(DependencyObject obj, string value)
27
        {
28
            _recursionProtection.Add(Thread.CurrentThread);
29
            obj.SetValue(DocumentXamlProperty, value);
30
            _recursionProtection.Remove(Thread.CurrentThread);
31
        }
32

33
        public static readonly DependencyProperty DocumentXamlProperty = DependencyProperty.RegisterAttached(
34
            "DocumentXaml",
35
            typeof(string),
36
            typeof(RichTextBoxHelper),
37
            new FrameworkPropertyMetadata(
38
                "",
39
                FrameworkPropertyMetadataOptions.AffectsRender | FrameworkPropertyMetadataOptions.BindsTwoWayByDefault,
40
                (obj, e) =>
41
                {
42
                    if (_recursionProtection.Contains(Thread.CurrentThread))
43
                        return;
44

45
                    var richTextBox = (RichTextBox)obj;
46

47
                    // Parse the XAML to a document (or use XamlReader.Parse())
48

49
                    try
50
                    {
51
                        var stream = new MemoryStream(Encoding.UTF8.GetBytes(GetDocumentXaml(richTextBox)));
52
                        var doc = (FlowDocument)XamlReader.Load(stream);
53

54
                        // Set the document
55
                        richTextBox.Document = doc;
56
                    }
57
                    catch (Exception)
58
                    {
59
                        richTextBox.Document = new FlowDocument();
60
                    }
61

62
                    // When the document changes update the source
63
                    richTextBox.TextChanged += (obj2, e2) =>
64
                    {
65
                        RichTextBox richTextBox2 = obj2 as RichTextBox;
66
                        if (richTextBox2 != null)
67
                        {
68
                            SetDocumentXaml(richTextBox, XamlWriter.Save(richTextBox2.Document));
69
                        }
70
                    };
71
                }
72
            )
73
        );
74
    }
75
}
76

Использование cookies

Мы используем файлы cookie в соответствии с Политикой конфиденциальности и Политикой использования cookies.

Нажимая кнопку «Принимаю», Вы даете АО «СберТех» согласие на обработку Ваших персональных данных в целях совершенствования нашего веб-сайта и Сервиса GitVerse, а также повышения удобства их использования.

Запретить использование cookies Вы можете самостоятельно в настройках Вашего браузера.