wpf 粘贴或移动图像后,在RichTextBox中保留图像源

zvms9eto  于 2023-08-07  发布在  其他
关注(0)|答案(1)|浏览(94)

我正在使用一个RichTextBox,它可以包含图像。我使用OpenFileDialog导入它们,然后将它们放入InlineUIContainer
它会显示出来,xaml代码如下所示。

<Paragraph>
    <Image Source="file://C:/Path/Test.png" Stretch="Fill" Width="200" Height="100" />
</Paragraph>

字符串
我可以保存我的xaml文档在数据库中,关闭它,并再次打开它没有任何问题,图像仍然会显示。
但是如果我把图像从文档中移走,或者复制并粘贴它,我的xaml代码就会变成如下所示:

<BlockUIContainer>
    <Image Stretch="Fill" Width="200" Height="100">
        <Image.Source>
            <BitmapImage BaseUri="pack://payload:,,wpf3,/Xaml/Document.xaml" UriSource="./Image1.png" CacheOption="OnLoad" />
        </Image.Source>
    </Image>
</BlockUIContainer>


它现在包含在一个BlockUIContainer中,我不想将其用于显示目的,但这不是我的更大问题,因为我丢失了ImageSource,因此无法再次显示它们。
你有什么解决方案来防止这种行为吗?
我尝试用DataObject.AddCopyingHandler et DataObject.AddPastingHandler拦截Copy and Paste事件,但无法获得所需的结果。
我也发现这个问题Saving source string of image in richtextbox after moving or pasting from clipboard有类似的问题,但我不明白“保存到XAML包”是什么意思。

cnh2zyt3

cnh2zyt31#

根据文档,DataFormats.XamlPackage
指定可扩展应用程序标记语言(XAML)包数据格式。
换句话说,这种格式可以将文档保存为打包的xaml。实际上,这是存档文件:二进制文件
因此,您可以获取字节数组并作为二进制数据(varbinary)保存到数据库,并在必要时将其加载到RichTextBox返回。
下面你可以找到一些示例,演示如何使用此格式从RichTextBox保存/加载文档,以保存和恢复包含图像的文档。
MainWindow.xaml

<Window x:Class="WpfApp11.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"        
        mc:Ignorable="d"
        Title="MainWindow" Height="250" Width="550" 
        x:Name="mainWindow" Topmost="True">
    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition Height="*"/>
            <RowDefinition Height="Auto"/>
        </Grid.RowDefinitions>
        <RichTextBox Grid.Row="0" x:Name="rtb" AllowDrop="True" Padding="2" FontSize="18"
                     HorizontalAlignment="Left"
                     VerticalScrollBarVisibility="Auto"
                     HorizontalScrollBarVisibility="Auto" >         
        </RichTextBox>

        <Grid Grid.Row="1" Margin="3">
            <Grid.ColumnDefinitions>
                <ColumnDefinition Width="*"/>
                <ColumnDefinition Width="Auto"/>
                <ColumnDefinition Width="Auto"/>
            </Grid.ColumnDefinitions>            
            <Button Grid.Column="1" Click="Button_Save" Margin="2" Padding="3">Save</Button>
            <Button Grid.Column="2" Click="Button_Load" Margin="2" Padding="3">Load</Button>
        </Grid>        
    </Grid>
</Window>

字符串
MainWindow.xaml.cs

using System;
using System.IO;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;

namespace WpfApp11
{
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
        }

        private void Button_Save(object sender, RoutedEventArgs e) { rtb.SaveRtf(); }

        private void Button_Load(object sender, RoutedEventArgs e) { rtb.LoadRtf(); }
    }

    public static class RichTextBoxExt
    {
        public static void SaveRtf(this RichTextBox rtb)
        {
            var dlg = new Microsoft.Win32.SaveFileDialog
            {
                DefaultExt = ".xpack",
                Filter = "XamlPackage Files (*.xpack)|*.xpack|All Files|*.*"
            };

            if (dlg.ShowDialog() == true)
            {
                try
                {
                    var range = new TextRange(rtb.Document.ContentStart, rtb.Document.ContentEnd);
                    using (var ms = new MemoryStream())
                    {
                        range.Save(ms, DataFormats.XamlPackage);
                        using (var file = new FileStream(dlg.FileName, FileMode.OpenOrCreate, FileAccess.Write))
                        {
                            ms.WriteTo(file);
                        }
                    }
                }
                catch (Exception ex)
                {
                    System.Diagnostics.Debug.WriteLine(ex.Message);
                }
            }
        }

        public static void LoadRtf(this RichTextBox rtb)
        {
            var dlg = new Microsoft.Win32.OpenFileDialog
            {
                DefaultExt = ".xpack",
                Filter = "XamlPackage Files (*.xpack)|*.xpack|All Files|*.*"
            };

            if (dlg.ShowDialog() == true)
            {
                var range = new TextRange(rtb.Document.ContentStart, rtb.Document.ContentEnd);
                using (var stream = new StreamReader(dlg.FileName))
                {
                    try
                    {
                        range.Load(stream.BaseStream, DataFormats.XamlPackage);
                    }
                    catch (Exception ex)
                    {
                        System.Diagnostics.Debug.WriteLine(ex.Message);
                    }
                }
            }
        }
    }
}

相关问题