我在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)
但似乎没有任何作用。
有任何想法吗?
实际上,我认为问题与无关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。