我在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");
但似乎没有效果。
有什么想法吗?
答案 0 :(得分:4)
实际上我认为问题与Build Action
无关,您可以将Build Action
设置为:
我认为问题出在您的图片上,正如您在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
,您现有的代码应该可以使用。