在wpf中循环 实例化Run的内容添加进入Richtextbox,展示后如何让所有的run都不换行插入?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在wpf中循环 实例化Run的内容添加进入Richtextbox,展示后如何让所有的run都不换行插入?相关的知识,希望对你有一定的参考价值。

插入的时候发现每使用一次 myFlowDoc.Blocks.Add(new Paragraph(run));方法插入的内容就换行了

参考技术A 你那都用Paragraph包装了当然就换行了!追问

找到了,para.Inlines.Add(run)

本回答被提问者采纳

WPF 以编程方式实例化用户控件以将其呈现为 PNG

【中文标题】WPF 以编程方式实例化用户控件以将其呈现为 PNG【英文标题】:WPF Instantiate User control programmatically to render it as PNG 【发布时间】:2010-11-30 11:44:16 【问题描述】:

我想在 DLL 中以编程方式实例化用户控件,然后将其保存为 PNG 文件。这对于 PngBitmapEncoder 和 RenderTargetBitmap 一般是没有问题的。

这是我的问题:

如何实例化控件?只需使用 new-operator? 我必须在单独的线程中实例化它吗? 如何强制控件更新其所有子级并再次呈现自身?

这是我实例化用户控件并将其保存为 PNG 文件的代码(LetterFrequency 是用户控件):

    [STAThread]
    static void Main(string[] args)
    
        LetterFrequency let = new LetterFrequency();
        let.Width = 600;
        let.Height = 400;
        let.Background = Brushes.White;

        let.Measure(new Size(let.Width, let.Height));
        let.Arrange(new Rect(new Size(let.Width, let.Height)));

        let.UpdateLayout();

        RenderTargetBitmap bitmap = new RenderTargetBitmap((int)let.Width, (int)let.Height, 96d, 96d, PixelFormats.Pbgra32);
        bitmap.Render(let);

        PngBitmapEncoder png = new PngBitmapEncoder();
        png.Frames.Add(BitmapFrame.Create(bitmap));

        using (Stream stm = File.Create("test.png"))
        
            png.Save(stm);
        
    

如果您以这种方式运行应用程序,它会生成 PNG 文件,但将添加到 XAML 中的数据不可见,如果您查看 XAML 设计器,您可以看到带有一些气泡的图表。 png 文件只包含图表区域,但没有气泡?为什么?我认为这是一个更新/渲染问题,但是如何解决这个问题?

这是 Visual Studio 解决方案,它包含控制台项目,它将用户控件呈现为 PNG 文件和图表的 WPF 工具包的其他两个项目。

看一下,它会分别在exe文件夹下的bin/Debug中生成PNG文件:http://www.file-upload.net/download-1904406/ChartRenderBitmap.zip.html

希望它没有问题!

谢谢!

【问题讨论】:

【参考方案1】:

您的图表中的数据不会在您的 PNG 文件中呈现,因为有一个动画应用于数据点的显示。看看窗口中的 LetterFrequency 控件,您会看到这些点逐渐显露出来。

您的代码在控件创建后立即对其进行快照,因此您看不到任何数据。

你可以:

    把这一切都包装在一个窗口中,然后告诉 它在 X 之后拍摄快照 秒 禁用所有动画 在您要进行的任何控件中 快照 也许有办法 “快进”动画 以编程方式,但我不能 找一个

这是解决方案 1,它有效:

    public partial class Window1 : Window

    System.Windows.Threading.DispatcherTimer snapshotTimer;

    public Window1()
    
        InitializeComponent();

        this.Width = 600;
        this.Height = 400;
        let.Width = 600;
        let.Height = 400;
        let.Background = Brushes.White;     

        this.Loaded += new RoutedEventHandler(Window1_Loaded);
    

    void Window1_Loaded(object sender, RoutedEventArgs e)
    
        this.snapshotTimer = new System.Windows.Threading.DispatcherTimer();
        this.snapshotTimer.Interval = TimeSpan.FromSeconds(2);
        this.snapshotTimer.Tick += new EventHandler(snapshotTimer_Tick);
        this.snapshotTimer.IsEnabled = true;
    

    void snapshotTimer_Tick(object sender, EventArgs e)
    
        this.snapshotTimer.IsEnabled = false;
        WritePng();
    

    void WritePng()
    
        RenderTargetBitmap bitmap = new RenderTargetBitmap((int)let.Width, (int)let.Height, 96d, 96d, PixelFormats.Pbgra32);
        bitmap.Render(let);

        PngBitmapEncoder png = new PngBitmapEncoder();
        png.Frames.Add(BitmapFrame.Create(bitmap));

        using (Stream stm = File.Create("test.png"))
        
            png.Save(stm);
        

        this.Close();
    

【讨论】:

感谢您提供有趣的解决方案,但图表的生成应尽快完成,因此最好不要动画。为了覆盖动画,我简单地为气泡数据点创建了一个新的控制模板,但是现在图例项还有另一个问题。看看我的回答帖子!

以上是关于在wpf中循环 实例化Run的内容添加进入Richtextbox,展示后如何让所有的run都不换行插入?的主要内容,如果未能解决你的问题,请参考以下文章

Qt如何循环创建线程

WPF RichTextBox 控件常用方法和属性

wpf groupbox无法动态添加子控件

qt中通过重写run方法创建线程与通过movetothread方法有啥区别

c#部分---需要实例化的内容;

C#中两个窗体将相互跳转