探索WPF中的ImageBrush和资源使用

在WPF(Windows Presentation Foundation)开发中,经常需要使用图像来美化界面。ImageBrush是WPF中一个非常强大的控件,它允许将图像作为画刷使用,从而可以改变控件的背景。然而,正确地使用ImageBrush并使其工作并非总是那么直观。本文将介绍一些使用ImageBrush时可能遇到的常见问题及其解决方案。

首先,来看一个简单的示例。假设想要创建一个ImageBrush,然后将其应用于一个按钮的背景。以下是尝试这样做的代码: System.Windows.Media.ImageBrush brush = new System.Windows.Media.ImageBrush(); BitmapImage img = new BitmapImage( new Uri( "@"images/image1.jpg", UriKind.RelativeOrAbsolute)); brush.ImageSource = img; btnImage.Background = brush; 这段代码看起来应该可以正常工作,但实际上它并不会显示图像,除非取消注释下面的代码,而这些代码实际上是不相关的。

为了解决这个问题,尝试在XAML中添加一个图像,并在代码后台中设置它: <Window x:Class="ImageBrush.Window1" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Title="Window1" Height="300" Width="300"> <StackPanel x:Name="sp1"> <Button x:Name="btnImage" Margin="10" Height="60"/> </StackPanel> </Window> System.Windows.Media.ImageBrush brush = new System.Windows.Media.ImageBrush(); BitmapImage img = new BitmapImage( new Uri( "@"images/image1.jpg", UriKind.RelativeOrAbsolute)); brush.ImageSource = img; btnImage.Background = brush; 但是,如果取消注释以下代码,上面的代码就可以正常工作了: Image img2 = new Image(); img2.Source = img; sp1.Children.Add(img2); 这似乎可以解决问题,但并不想要一个Image控件,所以需要找到ImageBrush的解决方案。

经过一番探索,发现ImageBrush可能需要从程序集资源中读取。在Tamir Khason的博客上,找到了一段代码,它允许这样做: // 代码示例 这非常酷,但它并没有完全解决问题。询问了Josh Smith,他建议将图像的Build Action设置为“Content”。这确实解决了问题,但需要注意的是,当将Build Action设置为“Content”时,也失去了本地化图像的能力。(使用Resource Build Action构建的图像是通过ResourceManager加载的,这意味着它们可以被替换为本地化卫星资源程序集中的图像。)

从这篇文章开始,将使用与Ian Griffiths的讨论中获得的一些信息。事实上,完全有可能在ImageBrush中使用编译后的资源,只需要一个更具体的URI,所以可以使用如下的URL: // 完整的Pack Uri示例 称测试应用程序为ImageBrushAsResource——显然,需要将组件的名称替换为自己的。

沪ICP备2024098111号-1
上海秋旦网络科技中心:上海市奉贤区金大公路8218号1幢 联系电话:17898875485