XAML WPF如何在FlowDocument上添加内联背景图像?
以下代码是将背景图像添加到Flow Document
Hello World!
问题是,如何更改ImageSource以便将图像数据作为字符串存储在xaml文件中? ImageBrush是密封的,所以我无法从中得到它。 我正在寻找这样的东西:
Hello World!
您可以通过以下机制(桌面WPF)执行此操作:
-
使用一个
DependencyProperty
创建一个自定义DependencyObject
子类 – 基本64图像字符串。 打电话给你的class级,比如ImageData
。 完成此操作后,您可以将类的命名实例添加到FlowDocument.Resources
或Window.Resources
(或Grid.Resources
或其他),并在XAML中直接初始化base64字符串。 -
创建一个自定义IValueConverter,将base64字符串转换为
BitmapImage
。 将此作为命名静态资源添加到Window.Resources
。 -
对于要用作流文档背景的每个图像,将
ImageData
添加到流文档本身的静态资源或更高级别的控件(如窗口)。 (注意 – 在我的旧版Visual Studio中,如果将图像资源添加到流文档本身,则表单设计者会感到困惑。但是,应用程序已编译并成功运行。) -
最后,为
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