RichTextBox 용 서식 도구 모음이 있습니다. 밑줄 버튼데이터베이스에서 RichTextBox로 텍스트를 복구 할 때 툴바의 밑줄 버튼이 업데이트되지 않습니다.
XAML :
private void UpdateToggleButtonState()
{
UpdateItemCheckedState(btnBold, TextElement.FontWeightProperty, FontWeights.Bold);
UpdateItemCheckedState(btnItalic, TextElement.FontStyleProperty, FontStyles.Italic);
UpdateItemCheckedState(btnUnderline, Inline.TextDecorationsProperty, TextDecorations.Underline);
UpdateItemCheckedState(btnAlignLeft, Block.TextAlignmentProperty, TextAlignment.Left);
UpdateItemCheckedState(btnAlignCenter, Block.TextAlignmentProperty, TextAlignment.Center);
UpdateItemCheckedState(btnAlignRight, Block.TextAlignmentProperty, TextAlignment.Right);
UpdateItemCheckedState(btnAlignJustify, Block.TextAlignmentProperty, TextAlignment.Justify);
}
private void UpdateItemCheckedState(ToggleButton button, DependencyProperty formattingProperty,
object expectedValue)
{
var currentValue = rtb.Selection.GetPropertyValue(formattingProperty);
button.IsChecked = currentValue != null && currentValue != DependencyProperty.UnsetValue &&
currentValue.Equals(expectedValue);
}
모든 나는 단지 텍스트 서식을 한 후 잘 작동 : (RTB가를 RichTextBox입니다)
<ToggleButton x:Name="btnUnderline" Command="{x:Static EditingCommands.ToggleUnderline}" CommandTarget="{Binding ElementName=rtb}">
<TextBlock Height="16" Width="16" Foreground="Black" Text="S" TextDecorations="Underline" TextAlignment="Center" />
</ToggleButton>
코드는 선택한 텍스트의 형식에 따라 도구 모음 단추의 상태를 업데이트 . 예를 들어 텍스트를 선택하고 굵게, 기울임 꼴 및 밑줄 형식을 적용한 다음 다른 위치에서 서식없이 텍스트를 선택하면 굵게, 기울임 꼴 및 밑줄 단추가 비활성화되고 서식있는 텍스트를 선택하면 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);
}
내가 문구를 작성하는 경우 굵게, 기울임 꼴 및 밑줄 형식을 적용하면 데이터베이스에 저장된 문자열입니다.
{\ rtf1 \ ansi \ ansicpg1252 \ uc1 \ htmautsp \ deff2 {\ fonttbl {\ f0 \ fcharset0 Times New Roman}} {\ f2 \ \ loch \ hich \ dbch \ pard \ plain \ ltrpar \ itap0 {\ lang1033 \ fs18 \ f2 \ cf0 \ cf0 \ blue255 \ green0 \ blue05 \ QL {\ F2 {\ lang5130의 \의 B \ 난 \ UL \ ltrch 일부 텍스트입니다.} \ li0 \ RI0 \ SA0 \ SB0 \ fi0 \ QL \ 파} } }
어떤 도움이 많이 이해할 수있을 것이다.
을 편집 UpdateItemCheckedState() 메소드
, currentValue.Equals (expectedValue를)는 실패 조건이다. 선택한 텍스트에 밑줄이 표시되어 있어도 항상 거짓입니다. 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;
."굵게, 기울임 꼴 및 밑줄 형식의 데이터베이스에있는 텍스트는 이제 (들여 쓰기 후)이다. 좋아 보이는
<FlowDocument PagePadding="5,0,5,0" AllowDrop="True" NumberSubstitution.CultureSource="User" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation">
<Paragraph>
<Run FontStyle="Italic" FontWeight="Bold" xml:lang="es-cr">
<Run.TextDecorations>
<TextDecoration Location="Underline" />
</Run.TextDecorations>
Some text.
</Run>
</Paragraph>
</FlowDocument>
하지만 밑줄 버튼을 사용하여 문제가 계속