为 ContentDialog 配置覆盖背景颜色
Configuring overlay background colour for ContentDialog
我正在使用深色主题为通用 windows 平台编写一个应用程序,我注意到虽然我在使用 ContentDialog
class 叠加层使整个页面变亮而不是变暗。
对话框显示之前:
显示对话框:
由于 ContentDialog
上没有 属性 来控制叠加层,我该如何覆盖正在使用的颜色?
经过一些实验,我发现上面显示的 ContentDialog
用于控制叠加颜色的画笔是 SystemControlPageBackgroundBaseMediumBrush
而不是看起来更像 ContentDialogDimmingThemeBrush
.
通过检查默认主题定义,浅色和深色主题都将此画笔设置为颜色资源 SystemBaseMediumColor
,浅色主题为 #99000000
,深色主题为 #99FFFFFF
。这会导致叠加层使浅色主题变暗并使深色主题变亮。
由于 SystemBaseMediumColor
被其他画笔定义引用,例如用于非活动轴标题的画笔定义,因此有必要覆盖 SystemControlPageBackgroundBaseMediumBrush
而不是它仅为深色主题引用的颜色。
为此,我们需要在 App.xaml
中的资源主题字典中或在合并到 App.xaml
中的资源 XAML 文件中重新定义画笔:[=21] =]
<Application>
<Application.Resources>
<ResourceDictionary>
<ResourceDictionary.ThemeDictionaries>
<ResourceDictionary x:Key="Dark">
<SolidColorBrush
x:Key="SystemControlPageBackgroundBaseMediumBrush"
Color="#99000000"
/>
</ResourceDictionary>
</ResourceDictionary.ThemeDictionaries>
</ResourceDictionary>
</Application.Resources>
</Application>
我使用了已接受答案的代码,但更改此画笔的颜色对我有用..."SystemControlPageBackgroundMediumAltMediumBrush"可能是因为我在阅读时使用的是周年纪念版
还要确保您的资源字典键与您正在使用的主题相匹配。我使用的是 "Light" 主题,所以我将资源字典 x:key 更改为...
<ResourceDictionary x:Key="Light">
试试下面的代码。
/// <summary>
/// Set the Overlay background for content Dialog
/// </summary>
/// <param name="subTree">Content Dialog reference</param>
public static void SetContentDialogOverlay(UIElement subTree)
{
var hostparent = VisualTreeHelper.GetParent(subTree);
var rect = FindVisualChild<Rectangle>(hostparent);
rect.Fill = new SolidColorBrush(Colors.Black);
rect.Opacity = 0.7;
}
/// <summary>
/// Find the child element from UIContainer
/// </summary>
/// <typeparam name="T"> Type</typeparam>
/// <param name="depObj"> Dependency Reference </param>
/// <returns></returns>
public static T FindVisualChild<T>(DependencyObject depObj) where T : DependencyObject
{
if (depObj != null)
{
for (int i = 0; i < VisualTreeHelper.GetChildrenCount(depObj); i++)
{
DependencyObject child = VisualTreeHelper.GetChild(depObj, i);
if (child != null && child is T)
{
return (T)child;
}
T childItem = FindVisualChild<T>(child);
if (childItem != null) return childItem;
}
}
return null;
}
现在,像这样在你的代码后面调用上面的方法----
// Based upon your access modifier i.e. public/private or protected
SetContentDialogOverlay(this);
这里,"this"表示Content Dialog引用,也可以传递ContectDialog的对象引用。
希望这对您更改叠加层的颜色有所帮助。
快乐编码.. :)
我在 App.xaml 中使用了以下代码。它适合我。
<Application.Resources>
<SolidColorBrush x:Key="SystemControlPageBackgroundMediumAltMediumBrush" Color="#00000000" />
</Application.Resources>
我正在使用深色主题为通用 windows 平台编写一个应用程序,我注意到虽然我在使用 ContentDialog
class 叠加层使整个页面变亮而不是变暗。
对话框显示之前:
显示对话框:
由于 ContentDialog
上没有 属性 来控制叠加层,我该如何覆盖正在使用的颜色?
经过一些实验,我发现上面显示的 ContentDialog
用于控制叠加颜色的画笔是 SystemControlPageBackgroundBaseMediumBrush
而不是看起来更像 ContentDialogDimmingThemeBrush
.
通过检查默认主题定义,浅色和深色主题都将此画笔设置为颜色资源 SystemBaseMediumColor
,浅色主题为 #99000000
,深色主题为 #99FFFFFF
。这会导致叠加层使浅色主题变暗并使深色主题变亮。
由于 SystemBaseMediumColor
被其他画笔定义引用,例如用于非活动轴标题的画笔定义,因此有必要覆盖 SystemControlPageBackgroundBaseMediumBrush
而不是它仅为深色主题引用的颜色。
为此,我们需要在 App.xaml
中的资源主题字典中或在合并到 App.xaml
中的资源 XAML 文件中重新定义画笔:[=21] =]
<Application>
<Application.Resources>
<ResourceDictionary>
<ResourceDictionary.ThemeDictionaries>
<ResourceDictionary x:Key="Dark">
<SolidColorBrush
x:Key="SystemControlPageBackgroundBaseMediumBrush"
Color="#99000000"
/>
</ResourceDictionary>
</ResourceDictionary.ThemeDictionaries>
</ResourceDictionary>
</Application.Resources>
</Application>
我使用了已接受答案的代码,但更改此画笔的颜色对我有用..."SystemControlPageBackgroundMediumAltMediumBrush"可能是因为我在阅读时使用的是周年纪念版
还要确保您的资源字典键与您正在使用的主题相匹配。我使用的是 "Light" 主题,所以我将资源字典 x:key 更改为...
<ResourceDictionary x:Key="Light">
试试下面的代码。
/// <summary>
/// Set the Overlay background for content Dialog
/// </summary>
/// <param name="subTree">Content Dialog reference</param>
public static void SetContentDialogOverlay(UIElement subTree)
{
var hostparent = VisualTreeHelper.GetParent(subTree);
var rect = FindVisualChild<Rectangle>(hostparent);
rect.Fill = new SolidColorBrush(Colors.Black);
rect.Opacity = 0.7;
}
/// <summary>
/// Find the child element from UIContainer
/// </summary>
/// <typeparam name="T"> Type</typeparam>
/// <param name="depObj"> Dependency Reference </param>
/// <returns></returns>
public static T FindVisualChild<T>(DependencyObject depObj) where T : DependencyObject
{
if (depObj != null)
{
for (int i = 0; i < VisualTreeHelper.GetChildrenCount(depObj); i++)
{
DependencyObject child = VisualTreeHelper.GetChild(depObj, i);
if (child != null && child is T)
{
return (T)child;
}
T childItem = FindVisualChild<T>(child);
if (childItem != null) return childItem;
}
}
return null;
}
现在,像这样在你的代码后面调用上面的方法----
// Based upon your access modifier i.e. public/private or protected
SetContentDialogOverlay(this);
这里,"this"表示Content Dialog引用,也可以传递ContectDialog的对象引用。
希望这对您更改叠加层的颜色有所帮助。 快乐编码.. :)
我在 App.xaml 中使用了以下代码。它适合我。
<Application.Resources>
<SolidColorBrush x:Key="SystemControlPageBackgroundMediumAltMediumBrush" Color="#00000000" />
</Application.Resources>