为ContentDialog

时间:2015-08-22 18:54:56

标签: xaml windows-runtime winrt-xaml windows-10 uwp

我正在使用黑暗主题为通用Windows平台编写应用程序,我注意到虽然我在使用ContentDialog类显示模式对话框时正确地将请求的主题设置为黑暗叠加使整个页面变亮,而不是使其变暗。

在显示对话框之前:

Screenshot of page before overlay

显示对话框:

Screenshot of page after overlay displayed

由于ContentDialog上没有属性来控制叠加层,如何覆盖正在使用的颜色?

4 个答案:

答案 0 :(得分:7)

经过一些实验,我发现用于控制上面显示ContentDialog的叠加层颜色的画笔是SystemControlPageBackgroundBaseMediumBrush,而不是更有可能看ContentDialogDimmingThemeBrush

通过检查默认主题定义,可以看出明暗主题都将此画笔设置为颜色资源SystemBaseMediumColor,其在灯光主题上为#99000000,而在黑暗主题上为{{1} }。这导致覆盖层使浅色主题变暗并使黑暗主题变亮。

由于#99FFFFFF是其他画笔定义(例如用于非活动透视标题的画笔定义)的引用,因此必须覆盖SystemBaseMediumColor而不是仅仅为黑暗主题引用的颜色。

要做到这一点,我们需要在SystemControlPageBackgroundBaseMediumBrush中的资源主题字典中或在合并到App.xaml的资源XAML文件中重新定义画笔:

App.xaml

答案 1 :(得分:1)

我将代码用于接受的答案,但改变这个画笔的颜色对我有用..." SystemControlPageBackgroundMediumAltMediumBrush"也许是因为我在阅读here

时正在使用周年纪念版

还要确保您的资源字典键与您正在使用的主题相匹配。我正在使用" Light"主题,所以我将资源字典x:key改为此...



<ResourceDictionary x:Key="Light">
&#13;
&#13;
&#13;

答案 2 :(得分:0)

请尝试以下代码。

    /// <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”表示内容对话框引用,或者您可以传递ContectDialog的对象引用。

希望,这将帮助您更改叠加层的颜色。 快乐编码.. :)

答案 3 :(得分:0)

我在App.xaml中使用了以下代码。它适合我。

<Application.Resources> <SolidColorBrush x:Key="SystemControlPageBackgroundMediumAltMediumBrush" Color="#00000000" /> </Application.Resources>