2017-03-24 72 views
2

我正在作爲一個測試此地點的工作,但基本上我試圖完成的是用戶爲每個「D」因爲單詞的第一個字母會將該文本的顏色更改爲紅色。通過將RichTextBox的前景綁定到我的Customers.TColor屬性來完成顏色更改。
我真正的邏輯問題都發生在我的TColor屬性作爲程序工作時,吸氣劑是尋找剛剛Character.Name的第一個字符只是單行(現在註釋掉):
return name.Length > 0 && name[0] == 'D' ? Brushes.Red : Brushes.Black;
不過,我想將此功能擴展到每個單詞。這裏是我的TColor屬性的邏輯:更改以特定字母開頭的每個單詞的顏色

public Brush TColor 
    { 
     get 
     { 
      string[] allNames = name.Split(null); 
      foreach (string n in allNames) 
      { 
       if(n[0] == 'D') 
       { 
        return Brushes.Red; 
       } 
       else 
       { 
        return Brushes.Black; 
       } 
      } 
      return Brushes.Black; 
      //return name.Length > 0 && name[0] == 'D' ? Brushes.Red : Brushes.Black; 
     } 
     set 
     { 
      tColor = defaultColor; 
     } 
    } 

我試圖做的是單獨獲得每個字,所以allNames應該拆分用戶輸入一個詞,然後檢查每個的人的第一個字符,如果是D將畫筆設置爲紅色,否則將該單詞的畫筆設置爲黑色。如果我退出了構建Customer對象時設置的默認值,則會出現運行時錯誤。
我想知道兩件事
1.如果這是我應該嘗試改變RichTextBody中單個單詞的顏色的方式。
2.如何有效地查看每個單詞的第一個字符並更改其顏色。
這裏是我的RichTextBody目前的樣子:

<StackPanel Orientation="Horizontal" VerticalAlignment="Top" HorizontalAlignment="Center" Margin="10,0,3.4,0" Width="505"> 
    <Label Content="Customer name:" /> 
    <RichTextBox x:Name="richTextBox" Height="100" Width="366"> 
     <FlowDocument> 
      <Paragraph Foreground="{Binding Customer.TColor}"> 
       <Run></Run> 
       <Run Text="{Binding Customer.Name, UpdateSourceTrigger=PropertyChanged, ValidatesOnDataErrors=True}" /> 
      </Paragraph> 
     </FlowDocument> 
    </RichTextBox> 
    <Button Content="Update" Command="{Binding UpdateCommand}"/> 
</StackPanel> 

我的相關變量和性能如下:

private string name; 
private Brush tColor; 
private Brush defaultColor = Brushes.Black; 

我的構造函數是:

public Customer(String customerName) 
    { 
     Name = customerName; 
     TColor = defaultColor; 
    } 

我的名字屬性是:

public String Name 
    { 
     get 
     { 
      return name; 
     } 
     set 
     { 
      name = value; 
      PropertyChanged?.Invoke(this, new PropertyChangedEventArgs("Name")); 
      PropertyChanged?.Invoke(this, new PropertyChangedEventArgs("TColor")); 
      //OnPropertyChanged("Name"); 
     } 
    } 

以防萬一我什麼都沒留下,a repo of the project is here

回答

1

本例使用TextChanged處理程序格式化RichTextBox中的單詞。它需要適應您的實施。

XAML

<Grid> 
    <RichTextBox x:Name="RichTextBox1" /> 
</Grid> 

代碼

public ColorizeWordWindow() { 
     InitializeComponent(); 
     this.RichTextBox1.TextChanged += RichTextBox_TextChanged; 
} 

    private void RichTextBox_TextChanged(object sender, TextChangedEventArgs e) { 
     RichTextBox1.TextChanged -= RichTextBox_TextChanged; 
     int position = RichTextBox1.CaretPosition. 
         GetOffsetToPosition(RichTextBox1.Document.ContentEnd); 

     foreach (Paragraph para in RichTextBox1.Document.Blocks.ToList()) 
     { 
     string text = new TextRange(para.ContentStart, para.ContentEnd).Text; 

     para.Inlines.Clear(); 

     // using space as word delimiter assumes en-US for locale 
     // other locales (Korean, Thai, etc.) will need adjustment 

     var words = text.Split(' '); 
     int count = 1; 

     foreach (string word in words) 
     { 
      if (word.StartsWith("D")) 
      { 
      var run = new Run(word); 

      run.Foreground = new SolidColorBrush(Colors.Red); 
      run.FontWeight = FontWeights.Bold; 
      para.Inlines.Add(run); 
      } 
      else 
      { 
      para.Inlines.Add(word); 
      } 

      if (count++ != words.Length) 
      { 
      para.Inlines.Add(" "); 
      } 
     } 
     } 

     RichTextBox1.CaretPosition = RichTextBox1.Document.ContentEnd. 
            GetPositionAtOffset(-position); 
     RichTextBox1.TextChanged += RichTextBox_TextChanged; 
    } 

結果

Screenshot

相關問題