在WPF中,将ResourceDictionary应用于Frame中的页面

4

我有一个WPF窗口,它仅包含一个Frame元素。该Frame显示一个页面;根据用户交互,显示的页面会发生变化。

<Window x:Class="MyWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Height="720" Width="1280">
    <Grid>
        <Frame Source="{Binding Source={StaticResource MainPageIntent}, Path=Path}"/>
    </Grid>
</Window>

我希望所有出现在该框架中的页面共享一个公共的资源字典,以便它们可以以一种常见的方式进行样式设置。

目前,每个页面都会加载类似于以下内容的代码:

<Page.Resources>
    <ResourceDictionary>
        <ResourceDictionary.MergedDictionaries>
            <ResourceDictionary Source="/ResourceDictionaries/BaseControlStyles/MenuStyle.xaml"/>

我希望可以在窗口上设置资源字典,然后它们会“继承”这些资源,但似乎并非如此。我尝试了以下方法,但在Frame加载的页面中,未应用MenuStyle.xaml中找到的样式到控件:

<Window x:Class="MyWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Height="720" Width="1280">
    <Window.Resources>
        <ResourceDictionary>
            <ResourceDictionary.MergedDictionaries>
                <ResourceDictionary Source="/ResourceDictionaries/BaseControlStyles/MenuStyle.xaml"/>
            </ResourceDictionary.MergedDictionaries>
        </ResourceDictionary>
    </Window.Resources>
    <Grid>
        <Frame Source="{Binding Source={StaticResource MainPageIntent}, Path=Path}"/>
    </Grid>
</Window>

有没有一种方法可以在窗口级别定义样式,使得所有在子框架中加载的页面都使用这些样式呢?
注意:我不想将这些样式应用于我的应用程序中的所有窗口,因此将这个ResourceDictionary放在我的App.xaml中似乎不是一个有效的解决方案。

窗口不是页面的逻辑父级,因此它无法从其字典中解析资源。因此,最后的选择是将其合并到应用程序资源中或在页面构造函数中合并每个页面实例中。 - Rohit Vats
1个回答

1
如果您想避免代码重复,可以在代码后台中编写。在帧ContentRendered上,您可以编写一个代码来向正在加载的页面添加资源。
<Frame Name="fr_View" ContentRendered="fr_View_ContentRendered"/>


private void fr_View_ContentRendered(object sender, System.EventArgs e)
{
     ResourceDictionary myResourceDictionary = new ResourceDictionary();
     myResourceDictionary.Source = new Uri("Dictionary1.xaml", UriKind.Relative);
     (fr_View.Content as System.Windows.Controls.Page).Resources.MergedDictionaries.Add(myResourceDictionary);
}

请查看此链接: 从代码设置应用程序资源


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接