2016-06-17 30 views
2

我有一個用於UWP類庫的UserControl。用戶控件將顯示GPS的信號電平。正確的方式來獲取作爲UWP類庫中的資源嵌入的圖像的uri

我使用的是BitmapIcon,它顯示信號電平並根據信號電平屬性進行更改。我使用的是BitmapIcon,這樣我可以改變前景色爲主題等

不管怎麼說,這是XAML

<BitmapIcon Grid.Column="1" UriSource="{Binding GpsSignalState, Converter={StaticResource SignalImageConverter}}" 
       Foreground="{Binding Foreground, ElementName=userControl}"/> 

它綁定到財產的ViewModel,並使用一個轉換器,將信號轉換到正確的圖像。

這裏是轉換器代碼。

public object Convert(object value, Type targetType, object parameter, string language) 
    { 
     if(value.GetType() != typeof(SignalStrength)) 
      return null; 

     var signal = (SignalStrength)value; 

     switch (signal) 
     { 
      case SignalStrength.Excellent: 
       return new Uri("ms-appx:///Assets/Img/Signal-Bars 4.png"); 
      case SignalStrength.VeryGood: 
       return new Uri("ms-appx:///Assets/Img/Signal-Bars 3.png"); 
      case SignalStrength.Good: 
       return new Uri("ms-appx:///Assets/Img/Signal-Bars 2.png"); 
      case SignalStrength.Valid: 
       return new Uri("ms-appx:///Assets/Img/Signal-Bars 1.png"); 
      case SignalStrength.Bad: 
       return new Uri("ms-appx:///Assets/Img/Signal-Bars 0.png"); 
      default: 
       throw new ArgumentOutOfRangeException(); 
     } 
    } 

正如你所看到的圖像位於調用/Assets/Img/

的圖像被設定打造類型Embedded Resource一個文件夾中。

我想象有人會問這使組件名稱爲Hardware.Sensors.GPS

我的問題是,圖像不會顯示。我沒有錯誤,我可以在轉換器中設置一個斷點來執行它。

我已經嘗試建立一個URI如

Uri("/Assets/Img/Signal-Bars 4.png", UriKind.Relative); 

Uri("ms-appx:///Assets/Img/Signal-Bars 4.png"); 

Uri("ms-appx:///Hardware.Sensors.GPS,component;/Assets/Img/Signal-Bars 4.png"); 

但沒有似乎工作的各種方式。

任何想法?

+0

他們需要成爲「嵌入式資源」的任何特定原因? – AlexDrenea

回答

0

設置生成操作Content複製到輸出目錄Do not copy和您現有的代碼應工作。

+0

似乎沒有工作 – Gaz83

+0

這個版本應該工作Uri(「ms-appx:/// Assets/Img/Signal-Bars 4.png」); – AlexDrenea

+0

不,不起作用。我有事件與BitmapIcon交換了一個圖像,如果您直接在圖像中分配圖像,仍然可以使用 – Gaz83

4

其實我覺得這個問題是不相關的Build Action,您可以設置Build Action到: enter image description here

我認爲這個問題是與你的圖片,你可以從BitmapIcon class官方文件看,在「備註「部分:

您使用的文件應該是透明背景上的實心圖像。

我用一些從here下載的圖像取代了你的圖像,它的工作原理。此BitmapIcon控件將使用顏色Foreground重新繪製填充了實心畫筆(不透明)的源圖像的部分。

所以,第一種方法,你可以替換你的圖片。

Sencond我想你可以使用一個控制是這樣的:

<Image Grid.Column="1" Source="{Binding GpsSignalState, Converter={StaticResource SignalImageConverter}}" /> 

有產權無ForegroundImage控制,但並不意味着你不能設置一個ForegroundImage控制,比如,你可以做這樣的:

<Grid Grid.Column="1"> 
    <Image Source="{Binding GpsSignalState, Converter={StaticResource SignalImageConverter}}" /> 
    <Rectangle VerticalAlignment="Stretch" HorizontalAlignment="Stretch" Opacity="0.4" 
       Fill="{Binding Foreground, ElementName=userControl}" /> 
</Grid> 

但這種方法不像Foreground屬性設置爲BitmapIcon,如果你堅持重將透明背景與圖像的Foreground顏色配合使用時,應使用BitmapIcon

+0

仍然不適合我。我刪除了我的圖片並從鏈接中下載了。我還添加了一個Image控件,並將其與位圖並排放置,並將其綁定到GpsSignalState。他們都沒有顯示圖像。我也按照你所說的設置了構建動作,並且還嘗試了「Copy to Output Directory」設置爲「Copy if newer」。仍然不起作用。我得到這種感覺,這不能在UWP – Gaz83

+0

@ Gaz83中完成,我也在UWP應用中嘗試過,所以它必須在UWP中完成。我認爲可能存在一些數據綁定問題。也許它與圖像無關,你可以上傳你的樣品嗎? –

+0

但是你是否通過創建類庫來實現這一點?我剛剛做了一個實驗,如果我將圖像,UserControl和轉換器從類庫中取出並放到我的測試項目中,那麼一切似乎都正常。由於它是一個大型圖書館,因此難以上傳。將看看我是否可以將其剝離。 – Gaz83