【问题标题】:WPF C# - Get inline formated bold Text from TextBlockWPF C# - 从 TextBlock 获取内联格式化粗体文本
【发布时间】:2016-05-09 11:03:21
【问题描述】:

我正在向StackPanel 中的Border 元素添加一些TextBlock 元素。 我通过添加Inlines 来添加和格式化TextBlock 的文本。

点击后,我想获取TextBlock的格式化文本。这是我的代码。

public void addText()
{
    TextBlock myText = new TextBlock();
    myText.Inlines.Add(new Bold(new Run("Hello ")));
    myText.Inlines.Add("World!");

    Border myBorder = new Border();
    myBorder.Child = myText;
    myBorder.MouseDown += new MouseButtonEventHandler(Border_Clicked);

    myStackPanel.Children.Add(myBorder);
}

private void Border_Clicked(object sender, MouseButtonEventArgs e)
{
    //Border senderBox = (Border)sender;
    //TextBlock senderText = (TextBlock)senderBox.Child;
    //Bold inline = (Bold) senderText.Inlines.ElementAt(0);
    // How to Output "Hello "?
}

Border_Clicked 应该输出“Hello”。如您所见,我可以使用粗体文本,但我该如何输出呢?

【问题讨论】:

  • 我认为内联只在 XAML 中直接有效。您可以在转换器中创建内联,但它很混乱。您可以在 FlowDocument 查看器中执行 FlowDocument。
  • 为了清楚地了解您的要求,请告诉我您想在 Border_Clicked 事件中获取粗体文本(Hello ),对吗?
  • 你不能像this answer一样简单地设置属性FontWeight吗?类似myText.Inlines.Add(new Run("Bold text") { FontWeight = FontWeight.Bold });
  • @Davy 是的,这正是我想要实现的目标。
  • @Sinatr 我没试过。如果我这样做,我将如何获得文本?

标签: c# wpf visual-studio textblock


【解决方案1】:

@Helen,有一种方法可以使用 TextRange 从 TextPointer 获取文本。试试这段代码

void myBorder_MouseDown(object sender, MouseButtonEventArgs e)
{
    var senderBox = (Border)sender;
    var senderText = (TextBlock)senderBox.Child;
    var inline = (Bold)senderText.Inlines.ElementAt(0);

    var textRange = new TextRange(inline.ContentStart, inline.ContentEnd);
    Console.WriteLine(textRange.Text);
}

【讨论】:

    【解决方案2】:

    Bold 元素中获取文本是否存在问题?

    private void Border_Clicked(object sender, MouseButtonEventArgs e)
    {
        var border = (Border)sender;
        var textBlock = (TextBlock)border.Child;
        var bold = (Bold)textBlock.Inlines.ElementAt(0);
    
        // How to Output "Hello "?
    
        // try
        var output = ((Run)bold).Text;
        // or rather (because Bold is a wrapper)
        var output = ((Run)bold.Inlines[0]).Text;
    }
    

    如果你可以像这样添加内联

    myText.Inlines.Add(new Run("Bold text") { FontWeight = FontWeight.Bold });
    

    那就是

    var run = (Run)textBlock.Inlines[0];
    var output = run.Text;
    

    【讨论】:

    • ɫ1 不知道你可以将 Inline 转换为 Run。
    【解决方案3】:

    无法在 MessageBox 中控制字体特征。我认为您应该考虑创建一个“自定义消息框”。像这样的:

    <Window x:Class="WpfApplication1.CustomMessageBox"
            xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
            xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
            SizeToContent="WidthAndHeight" MaxWidth="400">
    
        <Grid x:Name="GridContent" Margin="10">
    
        </Grid>
    </Window>  
    

    所以在它的构造函数中你可以发送你的 Bold:

    private Bold _text;
    public CustomMessageBox(Bold formattedText)
    {
       _text = formattedText;
       GridContent.Child = _text;
    }
    

    使用:

    private void Border_Clicked(object sender, MouseButtonEventArgs e)
    {
        Border senderBox = (Border)sender;
        TextBlock senderText = (TextBlock)senderBox.Child;
        Bold inline = (Bold) senderText.Inlines.ElementAt(0);
        var customMsgBox = new CustomMessageBox(inline);
        customMsgBox.ShowModal();
    }
    

    现在,如果您不确定它是否总是一个 Bold 对象,我建议您将格式化的文本保存在 XML 中,然后再加载它。看看这个:showing formatted text

    【讨论】:

    • 谢谢,但我不想将文本输出到消息框中,而是输出到TextBox。我无法将Bold 分配给TextBox.Text
    • 也许您应该为此使用 RichTextBox。将 Bold 元素另存为 xaml,并将其加载到 RichTextBox 中。看到这个:msdn.microsoft.com/en-us/library/aa970917(v=vs.100).aspx
    猜你喜欢
    • 1970-01-01
    • 2010-12-20
    • 1970-01-01
    • 2010-10-16
    • 2014-05-15
    • 1970-01-01
    • 1970-01-01
    • 2011-07-12
    相关资源
    最近更新 更多