2012-03-14 160 views
0

根据用户在窗口内的哪个导航页面,我有两个窗口的背景图像。图像位于我的项目文件夹内的位置:设置背景URI图像不工作

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

这正确显示图像:

/Resources/Images/MyImage1.jpg 

如果我用IDE来选择一个固定的背景图片,然后将XAML文件与更新。

然而,正如我希望的图像切换,我创建了一个视图模型为如下暴露一个URI属性窗口(其中实现INotifyPropertyChanged):

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设置为窗口构造函数的第一行中的Datacontext。如果我在它上面放置一个断点,它会执行这些行并且看起来没问题。

任何想法正在发生什么,或者我怎么能找出它出错的地方?

TIA

回答

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}}" /> 

图像然后System.Windows.Media.Imaging.BitmapImage的在你的财产视图模型..加载它,我有以下方法(这在加载/资源文件夹中的嵌入式图像:

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#写了这...

+0

感谢您的回复。现在不再是问题,但我使用.Net 4。 – millie 2012-05-17 15:40:44