TextBlock通过LineBreak内联附加行为问题

时间:2013-03-12 13:39:19

标签: c# wpf xaml mvvm attachedbehaviors

嗨,有没有办法检查Run是否只是LineBreak

首先进行一些扩展

建议您在RichTextBox中使用一些LineBreak创建一些文本现在让我们进一步建议您想要将文本保存在数据库中后,您可能会将FlowDocument转换为XML我如何我现在想在TextBlock中显示这个“XML-string”所以我将它转换回来,因为FlowDocument写了一个GetAllLine扩展并使用附加行为绑定到TextBlock.Inlines这里我的LineBreak问题发生{ {1}}不会产生<Run xml:lang='de-de' xml:space='preserve' />

现在这是我到目前为止

XAML

LineBreak

代码隐藏

<Window x:Class="TextBlockAttachedIssue.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:local="clr-namespace:TextBlockAttachedIssue"
        Title="MainWindow" Height="350" Width="525">
    <Grid>
        <TextBlock local:Bindable.Inlines="{Binding myInlines}" TextWrapping="WrapWithOverflow"/>
    </Grid>
</Window>

附加行为

namespace TextBlockAttachedIssue
{
    /// <summary>
    /// Interaktionslogik für MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();

            DataContext = new VM();
        }
    }

    public class VM
    {
        private IEnumerable<Inline> _myInlines;

        public VM()
        {
            var myParagraph =
                "<Paragraph xmlns='http://schemas.microsoft.com/winfx/2006/xaml/presentation'> " +
                "<Run xml:lang='de-de' xml:space='preserve' />" +
                "<Run xml:lang='de-de' xml:space='preserve' />" +
                    " das ist text davor" +
                    "<Run FontFamily='Palatino Linotype'> " +
                        "line2  dsf adsgf sd fds gs fd gsfd g sdfg df h g hdgf h fg hhgfdh gfh " +
                    "</Run> " +
                "<Run xml:lang='de-de' xml:space='preserve' />" +
                    "und das ist text danach" +
                "</Paragraph> ";
            var para = XamlReader.Load(XmlReader.Create(new StringReader(myParagraph))) as Paragraph;
            myInlines = para.Inlines.ToList();
        }

        public IEnumerable<Inline> myInlines
        {
            get { return _myInlines; }
            private set { _myInlines = value; }
        }
    }
}

1 个答案:

答案 0 :(得分:1)

我不相信Run代表换行符。为了表示换行符,使用了不同类型的Inline - LineBreak

FlowDocumentReader中查看时,您的文字没有任何换行符:

<FlowDocumentReader>
    <FlowDocument>
        <Paragraph xmlns='http://schemas.microsoft.com/winfx/2006/xaml/presentation'>
            <Run xml:lang='de-de' xml:space='preserve' />
            <Run xml:lang='de-de' xml:space='preserve' /> das ist text davor
            <Run FontFamily='Palatino Linotype'> 
                line2  dsf adsgf sd fds gs fd gsfd g sdfg df h g hdgf h fg hhgfdh gfh 
            </Run> 
            <Run xml:lang='de-de' xml:space='preserve' />
            und das ist text danach
        </Paragraph>
    </FlowDocument>
</FlowDocumentReader>
另一方面,

Paragraph是一个Block元素,它会突破到一个新行。也许段落引起了你的问题。

为什么不使用FlowDocumentReader来显示FlowDocument文本而不是TextBlock? 使用FlowDocumentReader,您将完全支持FlowDocument,包括段落和所有其他TextElement派生的项目。