Csharp/C#教程:XAML WPF如何在FlowDocument上添加内联背景图像?分享


XAML WPF如何在FlowDocument上添加内联背景图像?

以下代码是将背景图像添加到Flow Document

     Hello World!   

问题是,如何更改ImageSource以便将图像数据作为字符串存储在xaml文件中? ImageBrush是密封的,所以我无法从中得到它。 我正在寻找这样的东西:

       Hello World!   

您可以通过以下机制(桌面WPF)执行此操作:

  1. 使用一个DependencyProperty创建一个自定义DependencyObject子类 – 基本64图像字符串。 打电话给你的class级,比如ImageData 。 完成此操作后,您可以将类的命名实例添加到FlowDocument.ResourcesWindow.Resources (或Grid.Resources或其他),并在XAML中直接初始化base64字符串。

  2. 创建一个自定义IValueConverter,将base64字符串转换为BitmapImage 。 将此作为命名静态资源添加到Window.Resources

  3. 对于要用作流文档背景的每个图像,将ImageData添加到流文档本身的静态资源或更高级别的控件(如窗口)。 (注意 – 在我的旧版Visual Studio中,如果将图像资源添加到流文档本身,则表单设计者会感到困惑。但是,应用程序已编译并成功运行。)

  4. 最后,为Background.ImageBrush.ImageSource添加一个DataBinding ,将其链接到指定ImageData资源的base 64字符串属性,并使用自定义转换器将其转换为图像。

详情如下所示。 首先,自定义ImageData类非常简单:

 public class ImageData : DependencyObject { public static readonly DependencyProperty Base64ImageDataProperty = DependencyProperty.Register("Base64ImageData", typeof(string), typeof(ImageData)); public string Base64ImageData { get { return (string)(GetValue(Base64ImageDataProperty)); } set { SetValue(Base64ImageDataProperty, value); } } } 

接下来,自定义转换器和一些帮助程序实用程序:

 public class Base64ImageConverter : IValueConverter { public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) { string base64String = value as string; if (base64String == null) return null; return ImageHelper.Base64StringToBitmapImage(base64String); } public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) { throw new NotImplementedException(); } } public static class ImageHelper { public static BitmapImage Base64StringToBitmapImage(string base64String) { BitmapImage bitmapImage = new BitmapImage(); bitmapImage.BeginInit(); bitmapImage.StreamSource = new MemoryStream(Convert.FromBase64String(base64String)); bitmapImage.EndInit(); return bitmapImage; } public static string FileToBase64String(string filename) { using (var stream = File.Open(filename, FileMode.Open)) using (var reader = new BinaryReader(stream)) { byte[] allData = reader.ReadBytes((int)reader.BaseStream.Length); return Convert.ToBase64String(allData); } } } 

将它放在窗口,应用程序或其他一些方便您的中心位置的静态资源中,并可在整个应用程序中重复使用:

     

您还可以将其添加到流文档本身的静态资源中,以及下面显示的ImageData

现在,将ImageData添加到流文档的资源中:

       

最后,为后台添加绑定属性:

         

最后,正如我上面提到的,将静态ImageData资源放在流文档本身上会导致WPF表单设计器(在VS2008上)抛出虚假错误。 尽管错误,应用程序编译并成功运行。 将ImageData静态资源从流文档移动到更高的控件(如RichTextBox或包含它的FlowDocumentReader)可以解决问题。

经过多次精炼后,这是添加内联背景图像的最简单方法。 谢谢@dbc的转换器。

    /9j/4AAQSkZJRgABAQAAAQAB...          Hello World!   

这是转换器

 using System; using System.IO; using System.Windows.Data; using System.Windows.Media.Imaging; namespace MyProject { public class Base64ImageConverter : IValueConverter { public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) { string base64String = value as string; if (base64String == null) return null; BitmapImage bitmapImage = new BitmapImage(); bitmapImage.BeginInit(); bitmapImage.StreamSource = new MemoryStream(System.Convert.FromBase64String(base64String)); bitmapImage.EndInit(); return bitmapImage; } public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) { throw new NotImplementedException(); } } } 

它只适用于这两段代码。 是的,您可以使用Mode = OneWay绑定system:String。

根据文档,ImageBrush类是密封的,无法扩展。 文档说如果ImageBrush无法加载ImageSource,则会调用ImageBrush.ImageFailed事件。 请看这里: 文档

您可以在XAML中注册您的处理程序: 您的处理程序只需要读取ImageBrush.ImageSource的值,将String解析为BitmapImage对象,如此处所示的另一个问题并设置BitmapImage对象像ImageSource这样: yourImageBrush.ImageSource=Base64StringToBitmap(ImageBrush.ImageSource.GetValue.ToString())

上述就是C#学习教程:XAML WPF如何在FlowDocument上添加内联背景图像?分享的全部内容,如果对大家有所用处且需要了解更多关于C#学习教程,希望大家多多关注—计算机技术网(www.ctvol.com)!

本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。

ctvol管理联系方式QQ:251552304

本文章地址:https://www.ctvol.com/cdevelopment/1009798.html

(0)
上一篇 2021年12月29日
下一篇 2021年12月29日

精彩推荐