在UWP类库中将uri图像作为资源嵌入的正确方法

时间:2016-06-17 15:33:14

标签: c# uwp

我在UWP的类库中有一个UserControl。用户控件将显示GPS的信号电平。

我正在使用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");

但似乎没有效果。

有什么想法吗?

2 个答案:

答案 0 :(得分:4)

实际上我认为问题与Build Action无关,您可以将Build Action设置为: enter image description here

我认为问题出在您的图片上,正如您在BitmapIcon class的官方文档中所看到的那样,&#34;备注&#34;部分:

  

您使用的文件应该是透明背景上的纯色图像。

我用here下载的一些图片替换了您的图片,但它确实有用。此BitmapIcon控件将使用Foreground颜色重绘填充了源图像的实心画笔(不透明)的部分。

所以,第一种方法,你可以替换你的图像。

Sencond我认为您可以像这样使用Image控件:

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

Foreground控件没有Image属性,但这并不意味着您无法设置Foreground覆盖Image控件,你可以这样做:

<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

答案 1 :(得分:0)

构建操作设置为Content,将复制到输出目录设置为Do not copy,您现有的代码应该可以使用。