设置背景URI图像不起作用

时间:2012-03-14 14:43:15

标签: c# wpf data-binding viewmodel

我有一个窗口的两个背景图像,具体取决于用户在窗口中的导航页面。图像位于我的项目文件夹中的位置:

/Resources/Images/MyImage1.jpg

如果我使用IDE选择固定的背景图像,则xaml文件将更新为:

<NavigationWindow.Background>
    <ImageBrush ImageSource="/Blah.MyApp;component/Resources/Images/MyImage1.jpg" />
</NavigationWindow.Background>

这会正确显示图像。

但是,由于我想要切换图像,我已经为Window创建了一个ViewModel(它实现了INotifyPropertyChanged),它公开了一个Uri属性,如下所示:

private readonly string _image1 = "pack://application:,,,/Resources/Images/MyImage1.jpg";
private readonly string _image2 = "pack://application:,,,/Resources/Images/MyImage2.jpg";

public MainNavWindowViewModel()
{
    SetImage1();
}

private Uri _backgroundImg;
public Uri BackgroundImg
{
    get
    {
        return _backgroundImg;
    }
    private set
    {
        _backgroundImg = value;
        OnPropertyChanged("BackgroundImg");
    }
}

public void SetImage1()
{
    BackgroundImg = new Uri(_image1);
}

public void SetImage2()
{
    BackgroundImg = new Uri(_image2);
}

在主窗口的xaml文件中,我已将NavigationWindow.Background替换为:

<NavigationWindow.Background>
    <ImageBrush ImageSource="{Binding Path=BackgroundImg, Mode=OneWay}" />
</NavigationWindow.Background>

并将Windows的DataContext设置为ViewModel。

但是,此功能只在我的窗口上显示黑色背景(当我注释掉将ViewModel数据绑定到窗口的行时,这是相同的行为。)

我将ViewModel设置为Window构造函数第一行中的Datacontext。如果我在它上面放一个断点,它会执行这些行并且似乎没问题。

任何想法是什么,或者我如何解决它出错的地方?

TIA

2 个答案:

答案 0 :(得分:0)

您使用的是.NET 3.5吗? 有一个错误,但您可以使用转换器达到相同的效果:

Public Class BitmapImageToImageConverter
    Implements IValueConverter

    Public Function Convert(ByVal value As Object, ByVal targetType As System.Type, ByVal parameter As Object, ByVal culture As System.Globalization.CultureInfo) As Object Implements System.Windows.Data.IValueConverter.Convert
        Dim bitmapImage = TryCast(value, BitmapImage)
        Dim height As Double = 0

        Dim returnImage As New Image()

        If bitmapImage IsNot Nothing Then
            returnImage.Height = 15

            If parameter IsNot Nothing AndAlso Double.TryParse(parameter.ToString, height) Then
                returnImage.Height = height
            End If

            returnImage.Source = bitmapImage
        Else
            ' Set a default image if none is given
            Dim uriString = "pack://application:,,,/Resources/Images/nopicture.png"

            Dim img As New BitmapImage()
            img.BeginInit()
            img.UriSource = New Uri(uriString)
            img.EndInit()

            returnImage.Source = img
        End If

        Return returnImage
    End Function


    Public Function ConvertBack(ByVal value As Object, ByVal targetType As System.Type, ByVal parameter As Object, ByVal culture As System.Globalization.CultureInfo) As Object Implements System.Windows.Data.IValueConverter.ConvertBack
        Throw New NotImplementedException()
    End Function
End Class

使用:

<Window.Resources>
    <local:BitmapImageToImageConverter x:Key="imageConverter" />
</Window.Resources>

<ImageBrush ImageSource="{Binding Image, Converter={StaticResource imageConverter}}" />

Image是viewmodel中System.Windows.Media.Imaging.BitmapImage的一个属性..加载它我有以下方法(这会在/ Resources文件夹中加载一个嵌入的图像:

Protected Sub LoadBitmapImageFromResource(ByVal fileName As String)
    Dim assName = Assembly.GetCallingAssembly().GetName().Name
    Dim uriString = "pack://application:,,,/" + assName + ";component/Resources/" + fileName

    Dim img As New BitmapImage()
    img.BeginInit()
    img.UriSource = New Uri(uriString)
    img.EndInit()

    Image = img
End Sub

标准高度设置为15像素(在我的实现中,我使用我的转换器作为菜单项,因此它们非常小;)),但是您可以给出一个整数值作为ConverterParameter来设置图像的高度。

PS:对不起VB.NET,但是我的客户要求用VB.NET编写这个而不是c#...

答案 1 :(得分:0)

没关系,我弄清楚出了什么问题。图像资源的构建操作设置为嵌入式资源,但应将其设置为“资源”。不幸的是,只进行构建并不总是应用更改,因此需要重建或清理+构建。