2009-10-19 80 views
2

我目前正在嘗試在WPF項目中創建一些基本的文字處理器功能。我使用的是RichTextBox,並且知道所有的EditingCommands(ToggleBold,ToggleItalic等等)。我卡住的東西是允許用戶改變字體大小和字體的面,就像在MS Office中那裏只改變了所選文本的值一樣,如果沒有選定的文本,那麼值就會改變爲當前插入符的位置。我已經拿出了相當數量的代碼來實現這個功能,但是在沒有選定的文本內容時遇到了問題。這是我爲RichTextBox.Selection所做的。WPF Richtextbox FontFace/FontSize

TextSelection text = richTextBox.Selection; 
if (text.IsEmpty) 
{ 
    //doing this will change the entire word that the current caret position 
    //is on which is not the desire/expected result. 
    text.ApplyPropertyValue(RichTextBox.FontSizeProperty, value); 
} 
else 
    //This works as expected. 
    text.ApplyPropertyValue(RichTextBox.FontSizeProperty, value); 

所以我的問題是我應該怎麼做呢?有沒有更好/更方便的方法來做到這一點?有一個想法是,我需要在段落中插入一個新的Inline,但我無法弄清楚如何做到這一點。任何幫助表示讚賞。謝謝。


全部免責聲明:這是this問題,從7個月前一個確切的重新發布。我在找到解決完全相同的問題的同時找到了它,但是這個問題沒有得到解答,我希望現在有人能夠回答它。

回答

0

OK,只是找到了答案:

private void ChangeTextProperty(DependencyProperty dp, string value) 
    { 
     if (mainRTB == null) return; 

     TextSelection ts = richTextBox.Selection; 
     if (ts!=null) 
      ts.ApplyPropertyValue(dp, value); 
     richTextBox.Focus(); 
    } 
2

試試這個:

private void ChangeTextProperty(DependencyProperty dp, string value) 
      { 
       if (mainRTB == null) return; 
       TextSelection ts = mainRTB.Selection; 
       if (ts.IsEmpty) 
       { 
        TextPointer caretPos = mainRTB.CaretPosition; 
        TextRange tr = new TextRange(caretPos, caretPos); 
        tr.Text = " "; 
        tr.ApplyPropertyValue(dp, value); 
       } 
       else 
       { 
        ts.ApplyPropertyValue(dp, value); 
       } 
      } 

我希望它的伎倆

+0

我已考慮過該選項,但它在文本的末尾添加了一個空格。如果我之後刪除該空間,則字體更改效果消失。 – Elad 2009-10-19 08:11:09

1

你可以明確的焦點重新設置到RichTextBox的通過在將新值應用於TextRange之後調用其Focus()方法,或者更好地使工具欄項目不可聚焦。例如,如果你有字體大小的組合框:)

<ComboBox x:Name="FontSizeSelector" Focusable="False" /> 

然後,你可以使用原來的代碼,而無需調用焦點(:

text.ApplyPropertyValue(RichTextBox.FontSizeProperty, value);