2010-10-22 84 views
3

我試圖使用數據綁定格式化Tweet。我需要做的是根據它是什麼類型的內容來分割推文的Text值。使用XAML中的僅數據綁定在TextBlock中豐富格式的文本

text = "This is a Tweet with a hyperlink http://www.mysite.com" 

我需要添加一些顏色格式到文本值的http:// ...部分。

這裏是踢球者,我想這樣做只使用XAML數據綁定。

<TextBlock x:Name="Tweet1" FontWeight="Bold" Height="207.236" 
    LineHeight="55" TextAlignment="Left" TextWrapping="Wrap" 
    Width="1614.646" Text="{Binding XPath=/statuses/status[2]/text}" 
    FontSize="56" FontFamily="Segoe Book" 
    Foreground="{DynamicResource TextColor-Gray}" /> 

//需要結束看起來像

<TextBlock x:Name="Tweet1" FontWeight="Bold" ... FontSize="56" FontFamily="Segoe Book"> 
    <Run Foreground="{DynamicResource TextColor-Gray}" >This is a Tweet with a hyperlink</Run> 
<Run Foreground="{DynamicResource TextColor-Pink}" >http://www.mysite.com</Run> 
</TextBlock> 

這裏是一個正則表達式,我可以用它來分割文本值,但我試圖用嚴格數據綁定。

Regex regUrl = new Regex(@"/http:\/\/\S+/g"); 

建議?

回答

1

您不能綁定到Text並用Run s替代,因爲Text的類型爲String。相反,你需要綁定Inlines並提供分析文本(使用您正則表達式,例如),併產生相應的Inlines轉換器:

<TextBlock Inlines="{Binding XPath=/statuses/status[2]/text, Converter={StaticResource InlineConverter}}"/> 
+0

+1不能按照OP想要的方式完成。 – Ragepotato 2010-10-22 22:41:33

+0

那就是我想的。感謝您的確認。當我完成構建時,我會發布我的轉換器。 – discorax 2010-10-22 22:56:11

+4

您無法綁定到內聯。 「內聯屬性是隻讀的,不能通過標記設置」任何其他建議? – discorax 2010-10-22 23:35:46

2

我使用MVVMLight。我所做的是捕獲TextBlock的Loaded事件,並將其路由到「轉換器」。

using System.Collections.Generic; 
using System.Windows.Documents; 
using System.Windows.Controls; 

using GalaSoft.MvvmLight.Command; 

namespace Converters 
{ 
    public class MyInlineConverter 
    { 
     public RelayCommand<TextBlock> ConvertTextToInlinesCommand { get; private set; } 

     public MyInlineConverter() 
     { 
      ConvertTextToInlinesCommand = new RelayCommand<TextBlock>(textBlock => convertTextToInlines(textBlock)); 
     } 

     private static void convertTextToInlines(TextBlock textBlock) 
     { 
      foreach (Run run in textToInlines(textBlock.Text)) 
       textBlock.Inlines.Add(run); 
     } 

     private static IEnumerable<Run> textToInlines(string text) 
     { 
      List<Run> retval = new List<Run>(); 
      // Perform your conversion here. 
      return retval; 
     } 
    } 
} 

如果添加這個類的一個實例,以你的靜態資源,像這樣:

<converters:TMTInlineConverter x:Key="InlineConverter" /> 

然後你可以從你的TextBlock調用轉換如下:

     <TextBlock Text="{Binding MyPath}" TextWrapping="Wrap"> 
          <i:Interaction.Triggers> 
           <i:EventTrigger EventName="Loaded"> 
            <cmdex:EventToCommand Command="{Binding Source={StaticResource InlineConverter}, Path=ConvertTextToInlinesCommand}" CommandParameter="{Binding RelativeSource={RelativeSource Self}}" /> 
           </i:EventTrigger> 
          </i:Interaction.Triggers> 
         </TextBlock> 

道歉如果你不使用MVVMLight。如果你不是,我會把這個翻譯作爲練習給讀者。 :)