如何将 FlowDocument 添加到 StackPanel?

2024-01-16

我创建了以下内容class为了有一个easy way显示格式化的WPF 文档中的文本。

然而这个解决方案返回一个流程文件,我遇到了麻烦整合我当前应用程序中的这个 FlowDocument 只是添加文本块StackPanels、WrapPanels 和 Borders 等

如何将我创建的 FlowDocument 对象添加到现有的 StackPanels、Borders 和 WrapPanels 中?

替代文本 http://www.deviantsart.com/upload/11jt33i.png http://www.deviantsart.com/upload/11jt33i.png

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

namespace TestFlow23993
{
    public partial class Window1 : Window
    {
        public Window1()
        {
            InitializeComponent();

            StackPanel sp = new StackPanel();
            Border bd = new Border();
            FlowDocument fd = FlowDocumentParser.GetFlowDocument("You want to {i:always}
               use this library so it is both {b:easy} and {b:straight-forward} to 
               format documents. Here are some examples of {b:camel-case} strings: 
               {ex:firstName}, {ex:lastName}, {ex:title}, and {ex:allowUserToFilterRows}.");

            sp.Children.Add(fd); //error
            bd.Child = fd; //error


        }
    }

    public class FlowDocumentParser
    {
        private string markedUpText;
        private List<string> parts;
        private FlowDocument doc;

        public int FontSize { get; set; }
        public string FontFamily { get; set; }
        public TextAlignment TextAlignment { get; set; }

        public FlowDocumentParser(string markedUpText)
        {
            this.markedUpText = markedUpText;
            parts = markedUpText.Split(new char[] { '{', '}' }).ToList();
            SetDefaults();
        }

        void SetDefaults()
        {
            FontSize = 12;
            FontFamily = "Arial";
            TextAlignment = TextAlignment.Left;
        }

        public void BuildFlowDocument()
        {
            doc = new FlowDocument();
            Paragraph paragraph = new Paragraph();
            paragraph.TextAlignment = TextAlignment;
            doc.Blocks.Add(paragraph);

            foreach (var part in parts)
            {
                //ITALIC
                if (part.StartsWith("i:"))
                {
                    string text = part.ChopLeft("i:");
                    Run run = AddPart(paragraph, text);
                    run.FontStyle = FontStyles.Italic;
                }
                //BOLD
                else if (part.StartsWith("b:"))
                {
                    string text = part.ChopLeft("b:");
                    Run run = AddPart(paragraph, text);
                    run.FontWeight = FontWeights.Bold;
                }
                //EXAMPLE TEXT
                else if (part.StartsWith("ex:"))
                {
                    string text = part.ChopLeft("ex:");
                    Run run = AddPart(paragraph, text);
                    run.FontWeight = FontWeights.Bold;
                    run.Foreground = new SolidColorBrush(Colors.Brown);
                }
                else
                {
                    Run run = AddPart(paragraph, part);
                }
            }
        }

        Run AddPart(Paragraph paragraph, string text)
        {
            Run run = new Run(text);
            paragraph.Inlines.Add(run);
            run.FontSize = FontSize;
            run.FontFamily = new FontFamily(FontFamily);
            return run;
        }

        public FlowDocument GetBuiltFlowDocument()
        {
            return doc;
        }

        public static FlowDocument GetFlowDocument(string markedUpText)
        {
            FlowDocumentParser fdp = new FlowDocumentParser(markedUpText);
            fdp.BuildFlowDocument();
            return fdp.GetBuiltFlowDocument();
        }
    }

    public static class StringHelpers
    {
        public static string ChopLeft(this string line, string removeThis)
        {
            int removeThisLength = removeThis.Length;
            if (line.Length >= removeThisLength)
            {
                if (line.StartsWith(removeThis))
                    return line.Substring(removeThisLength, line.Length - removeThisLength);
                else
                    return line;
            }
            else
                return line;
        }
    }
}

如果将 FlowDocument 包装在 FlowDocumentReader 内,则可以将其添加到面板或边框:

StackPanel sp = new StackPanel();
Border bd = new Border();
FlowDocument fd = FlowDocumentParser.GetFlowDocument("You want to {i:always} use this library so it is both {b:easy} and {b:straight-forward} to format documents. Here are some examples of {b:camel-case} strings: {ex:firstName}, {ex:lastName}, {ex:title}, and {ex:allowUserToFilterRows}.");
FlowDocumentReader fdr = new FlowDocumentReader();
fdr.Document = fd;

sp.Children.Add(fdr);
bd.Child = fdr;
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何将 FlowDocument 添加到 StackPanel? 的相关文章

随机推荐

  • Chrome 加载资源“(从磁盘缓存)”速度缓慢

    My site http www front end io http www front end io配置HTTP请求优先从缓存加载资源 所以我的标题将是这样的 cache control max age 315360000 ETag W
  • 在列表视图中搜索,并在 Android 列表视图中突出显示搜索文本颜色

    我有一个listview with arrayadapter 我需要在我的音乐应用程序中实现这个 帮助我 public class Search Class extends Activity EditText searchedit List
  • TypeScript 编译并保留注释

    我希望在生成的 javascript 文件中保留完整的注释 默认情况下编译器会删除它们 有 tsc 参数吗 用例是保留 参考路径的 进行大胆的单元测试 自 2015 年起您可以创建tsconfig json在你的项目中并添加 removeC
  • 有没有办法在运行时访问调试符号?

    这是一些示例代码 可以让您了解我想要的内容 int regular function void int x y z do some stuff my api call return x void my api call void char
  • SQL Server - 是基于 GUID 的 PK,是支持基于租户的水平分区的最佳实践

    我试图找出设计未来需要水平分区的多租户数据库架构时最好的方法是什么 数据库中的一些粗略数字 租户总数约为10 000人 每个租户存储的数据量在 500MB gt 3GB 之间变化 租户数量一开始会很小 几年后会增加到 10 000 个 因此
  • 带有模板类的通用参考

    Example template
  • SQL高效调度生成算法

    The idea 想象一下教育中心有branches Courses该教育中心的信息对所有分支机构都是通用的 Branches CREATE TABLE Branch id int 10 unsigned NOT NULL AUTO INC
  • 升级到 Xcode 6.3 后,在启动时我收到错误:“无法解析 Bonjour 服务。” [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 升级到 Xcode 6 3 后 我现在收到一个带有错误的警报面板 The Bonjour service could not be res
  • HasActivityInjector 无法在 android dagger 2 中解决

    我试图实施有活动注入器在我的 Android 应用程序中 但它显示 HasActivityInjector 无法解析 下面是我在项目中使用的依赖项和插件 apply plugin kotlin kapt and implementation
  • Tomcat:查找目录时不附加尾随“/”

    我在 Tomcat 7 0 22 Java 1 6 MacOS Lion 中部署了 war 存档 战争称为 myapp war 因此 Tomcat 正在服务http localhost myapp http localhost myapp
  • 程序运行时间

    我如何 从程序 我的意思是在我这次要打印 最终返回 之前 找出我的程序运行的时间 提前致谢 edited 非常感谢您的所有回答 但我的程序很短 有没有其他方法可以找出微秒或纳秒的时间 因为使用下面的方法我收到 0 当程序启动时 你会这样做
  • 表单模型绑定 laravel 5.1 多个模型

    我想要 Laracollective 的 Form 包中的多个对象的 Form 模型绑定 如下所示 Form model user vendors array route gt array user update user gt id 我可
  • 为什么主键会自动创建聚集索引

    当我在oracle表中创建主键时 为什么它默认创建 聚集 索引 创建主键时自动创建聚集索引的原因是什么 难道Oracle设计者这样设计Oracle只是他的喜好吗 Oracle 将创建一个索引来管理没有预先存在的索引适用的唯一约束 如果没有索
  • Android - 以编程方式检查开发人员选项?

    我有一个使用意图用相机拍摄照片的应用程序 但最近我遇到了使用 后台进程限制 等开发人员选项的用户遇到的问题 他们关闭了所有后台应用程序 所以除了调用 onPause 和 onResume 之外 我的应用程序也被杀死了 我希望是否有可能检查此
  • SqlServer处于脚本升级模式

    Vista 刚刚完成了众多更新之一 重新启动计算机后 我尝试使用 Sql Server Management Studio 连接到 Sql Server 2008 实例 但收到此错误 连接到 MSSQLSERVER2008 时出错 附加信息
  • 使用 Jabber 发送网络消息

    也问过服务器故障 https serverfault com questions 19586 using jabber to send network messages 我也被建议将其发布在这里 我们需要在其他用户在线提交报告内容时通过网络
  • 如何在 TcxExtLookupComboBox 中使用 TcxCustomDataSource?

    我使用 Devexpress 的 TcxExtLookupComboBox 并尝试实现自定义数据源 我已经像这样设置了自定义数据源 procedure TMainForm FormCreate Sender TObject begin fD
  • 使用 R 将数据从 PDF 导入到 HTML

    有没有办法使用 R 将数据从 pdf 文件导入为 HTML 格式 我尝试使用以下代码 library tm filename file pdf doc lt readPDF control list text layout elem lis
  • Android NFC <技术列表> - 问题

    我想在 Android 上编写我的第一个 NFC 应用程序 为此 我使用 Android 开发人员链接 http developer android com guide topics nfc index html http develope
  • 如何将 FlowDocument 添加到 StackPanel?

    我创建了以下内容class为了有一个easy way显示格式化的WPF 文档中的文本 然而这个解决方案返回一个流程文件 我遇到了麻烦整合我当前应用程序中的这个 FlowDocument 只是添加文本块StackPanels WrapPane