Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 当文本从数据库恢复到RichTextBox时,工具栏中的下划线按钮不会更新_C#_Wpf_Database_Format_Richtextbox - Fatal编程技术网

C# 当文本从数据库恢复到RichTextBox时,工具栏中的下划线按钮不会更新

C# 当文本从数据库恢复到RichTextBox时,工具栏中的下划线按钮不会更新,c#,wpf,database,format,richtextbox,C#,Wpf,Database,Format,Richtextbox,我有一个RichTextBox格式工具栏 下划线按钮的XAML:(rtb是RichTextBox) 在我格式化文本后,一切正常。例如,如果我选择一些文本并应用粗体、斜体和下划线格式,然后在另一个位置选择不带格式的文本,粗体、斜体和下划线按钮将被禁用,当我选择格式化文本时,这3个按钮将再次激活 问题是当我从数据库保存和恢复文本时。除了下划线按钮外,其他一切都正常 恢复的文本确实在屏幕上加了下划线,但当我点击它或选择它时,只有粗体和斜体按钮被激活。下划线按钮保持停用状态 这是将格式化文本保存到数据库

我有一个RichTextBox格式工具栏

下划线按钮的XAML:(rtb是RichTextBox)

在我格式化文本后,一切正常。例如,如果我选择一些文本并应用粗体、斜体和下划线格式,然后在另一个位置选择不带格式的文本,粗体、斜体和下划线按钮将被禁用,当我选择格式化文本时,这3个按钮将再次激活

问题是当我从数据库保存和恢复文本时。除了下划线按钮外,其他一切都正常

恢复的文本确实在屏幕上加了下划线,但当我点击它或选择它时,只有粗体和斜体按钮被激活。下划线按钮保持停用状态

这是将格式化文本保存到数据库的代码:

string rtfText; // string to save to database
var tr = new TextRange(rtb.Document.ContentStart, rtb.Document.ContentEnd);

using (var ms = new MemoryStream())
{
    tr.Save(ms, DataFormats.Rtf);
    rtfText = Encoding.ASCII.GetString(ms.ToArray());
}
var rtfText = ... // string recovered from database
var byteArray = Encoding.ASCII.GetBytes(rtfText);

using (var ms = new MemoryStream(byteArray))
{
    var tr = new TextRange(rtb.Document.ContentStart, rtb.Document.ContentEnd);
    tr.Load(ms, DataFormats.Rtf);
}
要从数据库中恢复格式化文本,请执行以下操作:

string rtfText; // string to save to database
var tr = new TextRange(rtb.Document.ContentStart, rtb.Document.ContentEnd);

using (var ms = new MemoryStream())
{
    tr.Save(ms, DataFormats.Rtf);
    rtfText = Encoding.ASCII.GetString(ms.ToArray());
}
var rtfText = ... // string recovered from database
var byteArray = Encoding.ASCII.GetBytes(rtfText);

using (var ms = new MemoryStream(byteArray))
{
    var tr = new TextRange(rtb.Document.ContentStart, rtb.Document.ContentEnd);
    tr.Load(ms, DataFormats.Rtf);
}
如果我写短语“Some text.”并采用粗体、斜体和下划线格式,这就是保存到数据库中的字符串:

string rtfText; // string to save to database
var tr = new TextRange(rtb.Document.ContentStart, rtb.Document.ContentEnd);

using (var ms = new MemoryStream())
{
    tr.Save(ms, DataFormats.Rtf);
    rtfText = Encoding.ASCII.GetString(ms.ToArray());
}
var rtfText = ... // string recovered from database
var byteArray = Encoding.ASCII.GetBytes(rtfText);

using (var ms = new MemoryStream(byteArray))
{
    var tr = new TextRange(rtb.Document.ContentStart, rtb.Document.ContentEnd);
    tr.Load(ms, DataFormats.Rtf);
}
{\rtf1\ansi\ansicpg1252\uc1\htmautsp\deff2{\fonttbl{\f0\fcharset0 Times New Roman;}{\f2\fcharset0 Segoe UI;}}{\colortbl\red0\green0\BLUEN0;\red255\green255\BLUEN255;}\loch\hich\dbch\pard\plain\ltrpar\itap0{\lang1033\fs18\f2\cf0\cf0\cf0\ql{\f2{\lang5130\b\ul\LTRCH0\FISB0\FISB0}一些文本 } }

任何帮助都将不胜感激

编辑

在UpdateItemCheckedState()方法中,currentValue.Equals(expectedValue)是失败的条件。即使所选文本带有下划线,它也始终为false

编辑2

现在,我正在使用另一个代码生成将保存/恢复到数据库的文本

要保存:

using (var sw = new StringWriter())
{
    XamlWriter.Save(rtb.Document, sw);
    rtfText = sw.ToString(); // string to save to database
}
要恢复:

// rtfText is the string recovered from database
rtb.Document = XamlReader.Parse(rtfText) as FlowDocument;
对于短语“某些文本”。使用粗体、斜体和下划线格式,数据库中的文本现在是(缩进后):


一些文本。
看起来还可以,但下划线按钮的问题仍然存在。

多亏了的回答,下划线按钮终于按预期工作了

我确实改变了路线:

UpdateItemCheckedState(btnUnderline, Inline.TextDecorationsProperty, TextDecorations.Underline);
关于这一点:

UpdateItemUnderlineState(); // To manage the special case
UpdateItemUnderlineState()方法是:

private void UpdateItemCheckedStateUnderline()
{
    var currentValue = rtb.Selection.GetPropertyValue(Inline.TextDecorationsProperty);
    TextDecorationCollection collection = null;

    if (currentValue is TextDecorationCollection && currentValue != DependencyProperty.UnsetValue)
    {
        collection = currentValue as TextDecorationCollection;
    }

    btnUnderline.IsChecked = collection != null && collection.Count > 0;
}
谢谢Fanboy小姐

多亏了的回答,下划线按钮终于按预期工作了

我确实改变了路线:

UpdateItemCheckedState(btnUnderline, Inline.TextDecorationsProperty, TextDecorations.Underline);
关于这一点:

UpdateItemUnderlineState(); // To manage the special case
UpdateItemUnderlineState()方法是:

private void UpdateItemCheckedStateUnderline()
{
    var currentValue = rtb.Selection.GetPropertyValue(Inline.TextDecorationsProperty);
    TextDecorationCollection collection = null;

    if (currentValue is TextDecorationCollection && currentValue != DependencyProperty.UnsetValue)
    {
        collection = currentValue as TextDecorationCollection;
    }

    btnUnderline.IsChecked = collection != null && collection.Count > 0;
}
谢谢Fanboy小姐