2012-03-14 165 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