2013-10-20 1 views
0

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> 

하지만 밑줄 버튼을 사용하여 문제가 계속

답변

0

감사에 대한 대답의 msfanboythis question 마지막으로 밑줄 버튼이 예상대로 작동

내가 줄 변경 않았다.

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; 
} 

덕분에 msfanboy!