2012-12-25 31 views
2

我正在使用WPF中的textbox/richtextbox組件,我需要將其他文本框導入到它。目前,我使用一個RichTextbox控件來插入額外的自定義文本框(它們是必需的,因爲它是一個無法完成的表達式)。我遇到的問題是,當光標與richtexbox內部的文本框相鄰時,我需要將注意力集中在文本框中。它似乎忽略了組件並跳過它。其他人是否有解決方案?DotNet中Textbox/RichTextbox中的組件

我似乎無法控制WPF中RichTexbox的遊標或組件。

+0

哇。這個地方比較溢出死了。 。 。或者因爲它是聖誕節前夕? – rbtLong

+2

您應該嘗試使用[運行](http://msdn.microsoft.com/en-us/library/system.windows.documents.run%28v=vs.95%29.aspx)。看到這個[鏈接](http://stackoverflow.com/questions/13485533/wpf-richtextbox-seamless-textboxes-as-inlineuicontainers)和最終的解決方案 – Ramin

回答

2

我的RichTextBox中嵌入的UIComponent實際上是一個包含3個TextBoxes(base,superscript和subscript)的數字。我遇到的問題是光標無法集中到數字組件。

我一直在尋找的功能是這樣的。 。 。

RichTextBox.CaretPosition.GetAdjacentElement(LogicalDirection Direction) 

這是我的代碼。 。 。

public class MathRichTextbox : RichTextBox 
{ 
    public MathRichTextbox() 
    { 
     this.PreviewKeyDown += MathRichTextbox_PreviewKeyDown; 
    } 

    void MathRichTextbox_PreviewKeyDown(object sender, KeyEventArgs e) 
    { 
     Digit expr = null; 

     switch (e.Key) 
     { 
      case Key.Left: 
       expr = findAdjacentMathDigits(LogicalDirection.Backward); 
       break; 

      case Key.Right: 
       expr = findAdjacentMathDigits(LogicalDirection.Forward);      
       break; 
     } 

     if (expr != null) 
      this.Dispatcher.BeginInvoke(
       new ThreadStart(() => expr.FocusBase()), 
       System.Windows.Threading.DispatcherPriority.Input, null); 
    } 

    private Digit findAdjacentMathDigits(LogicalDirection direction) 
    { 
     Digit expr = null; 

     if (Selection.Text.Length == 0) 
     { 
      DependencyObject dpObj = CaretPosition.GetAdjacentElement(
       direction); 

      // is it contained in BlockUIContainer? 
      expr = CaretPosition.GetAdjacentElement(
       direction) as Digit; 

      // is it onctained in a InlineUIContainer? 
      if (expr == null) 
      { 
       InlineUIContainer uiWrapper = 
        CaretPosition.GetAdjacentElement(
        direction) as InlineUIContainer; 

       if (uiWrapper != null) 
        expr = uiWrapper.Child as Digit; 
      } 

     } 

     return expr; 
    } 

} 
+0

不錯;你不應該設置'e.Handled = true?' – Ramin

+1

當然,你可能會發現'RichTextBox.SelectionCharOffset'屬性intresting。 – Ramin

+0

我可能會在未來,但我不想打斷用戶,如果它沒有找到任何東西,如果它確實,它會專注於它自己的。感謝您的高舉。 – rbtLong

1

正如我在評論中所說的,您應該嘗試使用Run來代替。

A Run與TextBox沒有多大區別。我給大家舉一個例子:

您要添加此字符串「這是一個例子」在一個RichTextBox一個Paragraph的開頭:

Paragraph _para //I assume you have this 
TextPointer pointer=_para.ContentStart; 
Run run=new Run("This is an example",pointer); 

就是這樣。您可以設置FontSize,FontFamily和...其他屬性,如TextBox

run.Foregroung=Brushes.Red; 

希望它有幫助。

+0

亞傢伙,你的指針/鏈接真的有幫助。我想我可能會有一個有效的解決方案。如果有效,我會盡快與您分享。 – rbtLong

+0

你真好。 – Ramin

+0

好吧,我得到它的工作感謝您的幫助拉明。 – rbtLong