5

我有这个 XAML:

<TextBlock TextWrapping="Wrap" Foreground="Green"
           Text="This is some Green text up front. ">
    <TextBlock Foreground="Blue">
        This is some Blue text.
    </TextBlock>
    This is some Green text following the Blue text. 
    <Hyperlink>
        <TextBlock Text="And finally, this is a Hyperlink." TextWrapping="Wrap"/>
    </Hyperlink>
</TextBlock>  

而且我想知道如何在 C# 中以程序方式复制它。

我知道如何TextBlock在 C# 中创建 s,例如:

TextBlock tb = new TextBlock();
tb.Text="Some text"

我可以将多个TextBlocks 放在 C# 中的面板中。但我不明白你如何将TextBlocks 放入其他TextBlocks 中,并将TextBlocksHyperlink放入TextBlocks 中。

TextBlock是否以某种方式自动创建了一些容器对象和额外的对象?或者是否TextBlock有一些方法/属性允许它包含其他项目?

其他相关问题:
1. 将诸如 Click() 事件添加到 的最佳方法是什么Hyperlink
2.有没有办法让蓝色的文字换行更干净?在上面的 XAML 中,只要最右边的单词需要换行,整个蓝色文本块就会被换行。

感谢您提供的任何照明。

4

2 回答 2

7

您可以修改通过TextBlock 的 Inlines 属性公开的内联集合。上面的 XAML 示例看起来有点像这样:

TextBlock tb = new TextBlock
               {
                  Text = "This is some Green text up front.",
                  Foreground = Brushes.Green
               };

InlineCollection tbInlines = tb.Inlines;

tbInlines.Add(new Run
              {
                 Text = "This is some Blue text.",
                 TextWrapping = TextWrapping.Wrap,
                 Foreground = Brushes.Blue
              });

tbInlines.Add(new Run
              {
                 Text = "This is some Green text following the Blue text."
              });

Run hyperlinkRun = new Run("And finally, this is a Hyperlink.");

tbInlines.Add(new Hyperlink(hyperlinkRun));

至于你的相关问题:

1A) 虽然可以使用类上的 RequestNavigate 事件将事件处理程序挂钩到每个单独的 Hyperlink 实例,但设置和使用超出必要的内存的成本可能很高。相反,我建议利用路由事件并简单地将 RequestNavigate 事件挂接到所有超链接所在的容器。你可以这样做:

myContainer.AddHandler(
                     Hyperlink.RequestNavigateEvent, 
                     new RequestNavigateEventHandler(
                                                      (sender, args) =>
                                                      {
                                                        /* sender is the instance of the Hyperlink that was clicked here */
                                                      }));

2A)在您的 XAML 示例中,它将内部 TextBlock 视为需要全部包装在一起的元素。如果您使用我的基于运行的方法,则应该从包含的文本块继承换行。

于 2009-10-15T16:24:20.897 回答
1

我不知道 TextBlocks,但这是您在 RichTextBox 中的操作方式。您可以使用 RichTextBox 代替 TextBlock。

 RichTextBox rtbTest = new RichTextBox();
 rtbTest.IsDocumentEnabled = true;

 FlowDocument fd = new FlowDocument();
 Paragraph para = new Paragraph();

 Run r4 = new Run("Some Text To Show As Hyperlink");
 Hyperlink h4 = new Hyperlink(r4);
 h4.Foreground = Brushes.Red; //whatever color you want the HyperLink to be

 // If you want the Hyperlink clickable
 h4.NavigateUri = new Uri("Some URL");
 h4.RequestNavigate += new RequestNavigateEventHandler(h_RequestNavigate);
 // Leaving the two previous lines out will still make the Hyperlink, but it won't be clickable

 // use this if you don't want an underline under the HyperLink
 h4.TextDecorations = null;

 para.Inlines.Add(h4);

 fd.Blocks.Add(para);

 rtbTest.Document = fd;

对于普通文本,我只使用了超链接,但删除了使其可点击的两行。这会给文本颜色,但它不会是可点击的。虽然它仍然使光标改变。虽然我确信也有一个属性可以改变它。

于 2009-10-15T16:19:34.337 回答