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

Gaz*_*z83 3 c# uwp

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

我正在使用BitmapIcon显示信号电平的信号,它会根据信号电平属性而变化。我正在使用BitmapIcon,以便可以更改主题的前景色等。

无论如何,这是xaml

<BitmapIcon Grid.Column="1" UriSource="{Binding GpsSignalState, Converter={StaticResource SignalImageConverter}}" 
                Foreground="{Binding Foreground, ElementName=userControl}"/>
Run Code Online (Sandbox Code Playgroud)

它绑定到中的属性,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();
        }
    }
Run Code Online (Sandbox Code Playgroud)

如您所见,图像位于一个文件夹中 /Assets/Img/

图像设置为构建类型为Embedded Resource

我想有人可能会问这个,所以程序集名称是 Hardware.Sensors.GPS

我的问题是图像永远不会显示。我没有任何错误,可以在转换器中设置一个断点来执行它。

我尝试了各种方法来构建uri,例如

Uri("/Assets/Img/Signal-Bars 4.png", UriKind.Relative);
Run Code Online (Sandbox Code Playgroud)

Uri("ms-appx:///Assets/Img/Signal-Bars 4.png");
Run Code Online (Sandbox Code Playgroud)

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

但似乎没有任何作用。

有任何想法吗?

Gra*_*eng 5

实际上,我认为问题与无关Build Action,您可以设置Build Action为: 在此处输入图片说明

我认为问题出在您的图片上,正如您从BitmapIcon类的官方文档中的“备注”部分所看到的:

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

我用从此处下载的一些图片替换了您的图片,它可以正常工作。此BitmapIcon控件将用Foreground颜色重新绘制用源图像的实心画笔(不透明)填充的部分。

因此,第一种方法是,您可以替换图片。

第二,我认为您可以使用如下所示的Image控件:

<Image Grid.Column="1" Source="{Binding GpsSignalState, Converter={StaticResource SignalImageConverter}}" />
Run Code Online (Sandbox Code Playgroud)

没有控件的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>
Run Code Online (Sandbox Code Playgroud)

但是此方法与将Foreground属性设置为有所不同BitmapIcon,如果您坚持用Foreground图像的颜色替换透明背景,则应使用BitmapIcon

  • @ Gaz83,我想我知道问题了!我以为只有您的usercontrol在类库中。您的最后一条评论告诉我,您的图像也在类库中。我刚刚测试过,将模型类(用于“ SignalStrength”)以及转换器和用户控件全部放在类库中,但是将图像保留在UWP应用中,它仍然有效。问题实际上与转换器中的图像路径有关,如果图像全部位于类库的Assets / Img文件夹中,则路径应如下所示:`return new Uri(“ ms-appx:/// MyClassLibrary / Assets / Img / Signal-Bars 3.png“);`。 (3认同)