正确的方法来获取图像的uri作为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 /的文件夹中

将映像设置为“生成类型”作为“嵌入式资源”.

我想有人可能会问这个,所以程序集的名称是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");

但似乎没有任何作用.

有任何想法吗?

解决方法:

实际上,我认为问题与构建操作无关,您可以将构建操作设置为:
正确的方法来获取图像的uri作为UWP类库中的资源嵌入

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

The file that you use should be a solid image on a transparent background.

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

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

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

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

没有Image控件的Foreground属性,但这并不意味着您不能设置Image控件的Foreground封面,例如,您可以像这样进行操作:

<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.

上一篇:c#-无法从UWP的Windows运行时组件中的项目访问方法和类


下一篇:C#-Windows BluetoothLeAdvertisement不包含Android设备广播的服务uuid