好的,这是我的 2-fold 问题:
一种)
在开发过程中,我需要能够从深色主题切换到浅色主题,而无需在模拟器中运行应用程序- 这可能吗?如果是这样,怎么办?
二)
关于我的各种控件的颜色/等,我通常使用内置的标准颜色(如Foreground="{StaticResource PhoneSubtleBrush}"
)。
现在,如果我想创建自定义样式并想要 - 假设 - 将其设置Foreground
为灰色(使用浅色主题时)和橙色(使用深色主题时) - 这应该怎么做?
好的,这是我的 2-fold 问题:
一种)
在开发过程中,我需要能够从深色主题切换到浅色主题,而无需在模拟器中运行应用程序- 这可能吗?如果是这样,怎么办?
二)
关于我的各种控件的颜色/等,我通常使用内置的标准颜色(如Foreground="{StaticResource PhoneSubtleBrush}"
)。
现在,如果我想创建自定义样式并想要 - 假设 - 将其设置Foreground
为灰色(使用浅色主题时)和橙色(使用深色主题时) - 这应该怎么做?
A) 可以使用 Visual Studio 中的设计器查看页面在不同主题/口音组合下的外观。使用设备窗口(在“设计”菜单下)。Blend 中也存在类似的选项。
B)你可以用转换器来做到这一点,但我喜欢为这样的事情制作自己的资源。只需创建一个这样的类:
public class MyColorResource
{
/// <summary>
/// The resource name - as it can be referenced by within the app
/// </summary>
private const string ResourceName = "MyColorResource";
/// <summary>
/// Initializes a new instance of the <see cref="MyColorResource"/> class.
/// </summary>
public MyColorResource()
{
try
{
// This doesn't work in the designer - so don't even try
if (DesignerProperties.IsInDesignTool)
{
return;
}
// Make sure we don't try and add the resource more than once - would happen if referenced on multiple pages or in app and page(s)
if (!Application.Current.Resources.Contains(ResourceName))
{
if (Visibility.Visible == (Visibility)Application.Current.Resources["PhoneDarkThemeVisibility"])
{
Application.Current.Resources.Add(ResourceName, new SolidColorBrush(Colors.Red));
}
else
{
Application.Current.Resources.Add(ResourceName, new SolidColorBrush(Colors.Gray));
}
}
}
catch (Exception exc)
{
System.Diagnostics.Debug.WriteLine("Something went wrong - ask for your money back");
System.Diagnostics.Debug.WriteLine(exc);
}
}
}
在您的应用程序中的某处对其进行引用(在 App.xaml 中或您的主页通常都很好)
<phone:PhoneApplicationPage.Resources>
<local:MyColorResource x:Key="AnythingAsNotActuallyUsed" />
</phone:PhoneApplicationPage.Resources>
然后,您可以像任何其他资源一样在 XAML 中使用它:
<TextBlock Foreground="{StaticResource MyColorResource}" Text="{Binding Name}" />