2016-06-17 17 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