【问题标题】:How do I set my main application theme on a dialog box, without setting it explicitly in the XAML?如何在对话框中设置我的主应用程序主题,而不在 XAML 中明确设置?
【发布时间】:2011-01-09 17:37:59
【问题描述】:

更新

我很尴尬地说我犯了一个错误。错误是我的主题没有设置我用来测试的元素的样式,所以我当然没有看到应用的样式。

但是,对这个问题的回答确实显示了如何将资源从一个 UserControl 显式设置到另一个......这很有趣。

当我按照下面描述的方式在应用程序上设置资源时,它确实会在结果应用程序中隐式设置所有用户控件主题。


我正在使用一个主题,在我的主应用程序类上设置为 ResourceDictionary。我猜我的主窗口隐含地使用这个主题来设置自己的样式。

<Application>
    <Application.Resources>
        <ResourceDictionary Source="Themes/ExpressionDark.xaml" />

下面的cmets是错误的,一切都是隐式的

但是,当我显示一个对话框时,它没有样式。

DialogBox dialog = new DialogBox();
dialog.ShowDialog();

是否有某种方法可以隐式执行此操作,而无需在 DialogBox 的 XAML 中显式指定样式?

编辑

我尝试通过以下方式设置资源。他们没有工作。

Window main = App.Current.Windows[0];
dialog.Resources = main.Resources;
dialog.Owner = main;

还尝试从主应用程序设置...这是定义原始资源的位置。

dialog.Resources = App.Current.Resources;

【问题讨论】:

    标签: c# wpf xaml dialog


    【解决方案1】:

    你可以像下面这样实现:

    dialog.Resources.MergedDictionaries.Add( this.Resources.MergedDictionaries[0] );
    

    另一种可能性是从应用程序加载它们(但我不喜欢):

    ResourceDictionary dict = Application.LoadComponent( new Uri( "<library>;component/Themes/<theme>.xaml", UriKind.Relative ) ) as ResourceDictionary;
    
    dialog.Resources.MergedDictionaries.Add( dict );
    

    【讨论】:

    • 感谢您的评论,但似乎我犯了一个错误。
    【解决方案2】:

    如果你不需要指定对话特定的资源,你可以以一种或另一种方式转移资源,或者只是将对话的资源设置为主窗口的资源:

        public Dialogue(Window owner)
        {
            this.InitializeComponent();
            Owner = owner;
            Resources = Owner.Resources;
        }
    

    (因为是对话,所以我也设置了Owner 属性)

    【讨论】:

    • 好的,看起来我犯了一个错误,我的对话框被隐式设置但默认设置。不过感谢您的回复,这也可以。
    • 好像是这样,我只是做了一点实验,你是对的,适用于所有窗口。
    猜你喜欢
    • 2012-03-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多