为 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>