我认为这是一个非常常见的问题,但我无法为我找到合适的解决方案。众所周知,WP支持黑暗和浅色主题。用户可以更改主题,并且有多种方法可以覆盖他的决定并在您选择的颜色主题中显示所有内容。但是,我只是想对这两种主题类型做出反应,我想以正确的颜色显示图标。
如果您使用应用栏,您可以从许多内置图标中进行选择,这些图标将自动从亮到暗反转,反之亦然。
为什么没有对普通图像的支持?例如:我想显示一个电话图标。我从内置图标中选择了一个,并将其从Microsoft SDK文件夹复制到我项目的Image文件夹中。如果用户使用黑暗主题,一切都会很好,因为白色电话图标将在黑色背景上可见。但如果他切换到灯光主题,图标将不可见,因为它是白色的白色。
我完全了解文本框或背景颜色的样式资源,它们使用手机的重音或主题颜色。但是为什么不支持我作为Image添加到我的XAML页面的简单图标?
当然,如果用户处于黑暗或轻度模式,我可以在页面的构造函数中检测到。然后我会加载黑色或白色版本的电话图标。但每次访问页面时都会进行此检查,并减慢所有操作。每次添加主题感知图像时手动添加主题检查也很烦人。
是否有任何解决方案,仅适用于XAML?或者至少容易维护?为什么我不能从一开始就使用SDK中的内置图像?它们已经有深色和浅色版本,已经在应用程序栏中使用。
答案 0 :(得分:36)
如果您希望图标在操作栏中起作用,只需白色(如果是黑暗主题)和黑色(如果是浅色主题),那么您可以将图像作为不透明蒙版添加到矩形中,如下所示:
<Rectangle Fill="{StaticResource PhoneForegroundBrush}" Width="48" Height="48" >
<Rectangle.OpacityMask>
<ImageBrush ImageSource="/Images/my.icon.png" />
</Rectangle.OpacityMask>
</Rectangle>
其中my.icon.png是白色图片,就像您可以为操作栏选择的那样。
答案 1 :(得分:3)
您可以使用矢量图形而不是位图图标,并使用主题感知画笔来绘制它们。
如果您希望应用响应主题的切换,您需要以任何方式响应它。
我在我的Views的基类中添加了一个属性,该属性返回所选主题。这样我可以使用/ bind到那个值。
也可以使用ValueConverter将资源的逻辑名称转换为主题特定资源的名称。
修改强>
答案 2 :(得分:1)
检测主题(Supporting dark and light themes为此提供最佳解决方案,我认为),然后相应地设置图像。如果你经常这么做,一个自定义控件,你可以提供两个图像源,并使用正确的一个,这将很容易创建。
编辑:这是关于此主题的另一篇好文章。 New Screen Resolutions
答案 3 :(得分:0)
你选择一个白色Foregrounded图标使用它。它适合光明和黑暗主题。那就是我一直在做的事情。
答案 4 :(得分:0)
Coding 4 Fun控件工具包包含一个模拟应用程序栏按钮的圆形按钮,包括根据主题更新前景色。代码是开源的,所以也许你可能会在那里找到答案。或者,作为黑客攻击,您可以使用RoundButton控件,关闭边框,而不是提供Click
事件。