2012-12-03 63 views
0

我有一個textBlock,我在其中添加了一些文本,例如如下所示:更改文本塊中單擊文本的格式

textBlock1.Inlines.Add(new Run("One ")); 
textBlock1.Inlines.Add(new Run("Two ")); 
textBlock1.Inlines.Add(new Run("Three ")); 

如何添加單擊事件以更改已被單擊的內聯文本的顏色?

例如如果點擊「One」,我希望它有一個紅色的字體;那麼如果點擊「Two」,我想讓「One」再次變成黑色,「Two」變成紅色,這樣最後單詞的顏色變成紅色。

我是用c#和wpf編程的新手。

感謝您的幫助

+1

什麼TextBlock的? Maibe TextBox? –

+0

據我瞭解,我有更多的控制與textBlock不同風格的文本格式,我不需要文本是可選擇或可編輯的。 –

回答

1

像這樣的東西應該做的伎倆

 public MainWindow() 
    { 
     InitializeComponent(); 
     textBlock1.Inlines.Add(new Run("One ")); 
     textBlock1.Inlines.Add(new Run("Two ")); 
     textBlock1.Inlines.Add(new Run("Three ")); 
    } 

    private SolidColorBrush _blackBrush = new SolidColorBrush(Colors.Black); 
    private SolidColorBrush _redBrush = new SolidColorBrush(Colors.Red); 
    private Run _selectedRun; 

    private void TextBlock_MouseDown(object sender, MouseButtonEventArgs e) 
    { 
     var run = e.OriginalSource as Run; 
     if (run != null) 
     { 
      if (_selectedRun != null) 
      { 
       _selectedRun.Foreground = _blackBrush; 
       if (_selectedRun == run) 
       { 
        return; 
       } 
      } 
      run.Foreground = _redBrush; 
      _selectedRun = run; 
     } 
    } 

但你必須處理單擊帶有「的MouseDown」或「的MouseUp」的文本塊沒有Click事件

要在特定索引處着色,這是一個快速示例。

private void ColorInlineAtIndex(InlineCollection inlines, int index, Brush brush) 
{ 
    if (index <= inlines.Count - 1) 
    { 
      inlines.ElementAt(index).Foreground = brush; 
    } 
} 

用法:

ColorInlineAtIndex(textBlock1.Inlines, 2, new SolidColorBrush(Colors.Blue)); 

查找位置:

private void TextBlock_MouseDown(object sender, MouseButtonEventArgs e) 
{ 
    var run = e.OriginalSource as Run; 
    if (run != null) 
    { 
     int position = (sender as TextBlock).Inlines.ToList().IndexOf(run); 
    } 
} 
+0

編輯答案添加完整示例 –

+0

添加上面的示例 –

+0

謝謝。這完美的作品,並指出我在正確的方向非常有用!如果我可能在這裏再提出兩個相關的問題,如果我的文本塊有更多的內聯,1.)我怎樣才能使文本紅色指定內聯,例如第十個(或任何其他數字)例如如果我想讓第十個單詞變成紅色? 2.)相反,當單擊內聯時,如何知道內聯框架在文本塊內聯集合中的位置是,即它是第十四還是第四十一內聯已被點擊? –