我正在使用C#
WPF应用程序,使用.resx文件进行资源管理.现在,我试图添加图标(.ico)到项目,但我遇到一些问题.
<Image Name="imgMin" Grid.Column="0" Stretch="UniformToFill" Cursor="Hand" MouseDown="imgMin_MouseDown"> <Image.Style> <Style TargetType="{x:Type Image}"> <Setter Property="Source" Value="\Images\minimize_glow.ico"/> <Style.Triggers> <Trigger Property="IsMouSEOver" Value="True"> <Setter Property="Source" Value="\Images\minimize_glow.ico"/> </Trigger> </Style.Triggers> </Style> </Image.Style> </Image>
这很好,但是当我将图标移动到AppResources.resx中时,我遇到了在xaml代码中引用它的问题.我应该使用什么而不是上面的Setter Property = …行?这个:
<Setter Property="Source" Value="{x:Static res:AppResources.minimize}"/>
不行,我想我可能需要使用不同于“Source”的属性,因为Value不是指向图标的字符串,而是现在的图标本身.我不知道使用哪一个 – 有些帮助吗?
解决方法
Source属性不“想要”一个字符串,它只是在它获得一个字符串时转换它.如果您向资源添加图标,那么它将是System.Drawing.Icon类型.您将需要通过转换器将其转换为ImageSource.
您可以静态访问资源,但需要符合x:Static
的预期语法.
例如
xmlns:prop="clr-namespace:Test.Properties"
<Image MaxHeight="100" MaxWidth="100"> <Image.Source> <Binding Source="{x:Static prop:Resources.icon}"> <Binding.Converter> <vc:IconToImageSourceConverter/> </Binding.Converter> </Binding> </Image.Source> </Image>
public class IconToImageSourceConverter : IValueConverter { public object Convert(object value,Type targetType,object parameter,System.Globalization.CultureInfo culture) { var icon = value as System.Drawing.Icon; var bitmap = icon.ToBitmap(); //https://stackoverflow.com/questions/94456/load-a-wpf-bitmapimage-from-a-system-drawing-bitmap/1069509#1069509 MemoryStream ms = new MemoryStream(); bitmap.Save(ms,System.Drawing.Imaging.ImageFormat.Png); ms.Position = 0; BitmapImage bi = new BitmapImage(); bi.BeginInit(); bi.StreamSource = ms; bi.EndInit(); return bi; } public object ConvertBack(object value,System.Globalization.CultureInfo culture) { throw new NotSupportedException(); } }
笔记:
>资源访问修饰符必须是public>如果图像被添加为“图像”,则最终会出现位图而不是图标,这需要不同的转换器