为什么不应用ResourceDictionary的样式资源?

时间:2013-11-14 15:57:53

标签: wpf xaml blend

我尝试将所有资源添加到资源模板文件中,并将它们合并为动态资源(正如Blend所做的那样)。程序编译并运行正常,但样式根本不适用。奇怪的是,他们 在预览中应用了。这是我的代码:

// MyUserControl.xaml
<UserControl x:Class="MyProject.MyUserControl"
         xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
         xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
         xmlns:d="http://schemas.microsoft.com/expression/blend/2008" mc:Ignorable="d"
         d:DesignHeight="411" d:DesignWidth="645">
     <Grid>
        <Button Content="Click here" Style="{DynamicResource MyButtonStyle}" />                
     </Grid>
 </UserControl>

-

// MyStyleTemplates.xaml
<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
                    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">

    <Style x:Key="MyButtonStyle" TargetType="{x:Type Button}">
        <Setter Property="Background">
            <Setter.Value>
                <LinearGradientBrush EndPoint="0,1" StartPoint="0,0">
                    <GradientStop Color="#FF263B5B" Offset="0"/>
                    <GradientStop Color="#FF65FD43" Offset="1"/>
                </LinearGradientBrush>
            </Setter.Value>
        </Setter>
    </Style>
</ResourceDictionary>

-

// App.xaml
<Application x:Class="MyProject.App"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
    <Application.Resources>
        <ResourceDictionary>
            <ResourceDictionary.MergedDictionaries>
                <ResourceDictionary Source="/MyProject;component/MyStyleTemplates.xaml"/>
            </ResourceDictionary.MergedDictionaries>
        </ResourceDictionary>
    </Application.Resources>
</Application>

我尝试完全相同,但然后将Style代码放在<UserControl.Resources>文件中的MyUserControl.xaml标记内,并且再次正常工作,因此样式没有任何问题本身。为什么会这样?

修改

由于这可能与它有关,文件夹结构可能略有不同寻常,如下所示:

MyProjectFolder /
    MyProject.csproj
    MyStyleTemplates.xaml
    Main /
       App.xaml
    GUI /
       MyUserControl.xaml
       MyUserControl.xaml.cs

这是允许的吗?

2 个答案:

答案 0 :(得分:0)

在App.xaml中更改ResourceDictionary合并,如下所示

<ResourceDictionary Source="pack://application:,,,/MyProject;component/MyStyleTemplates.xaml"/>

答案 1 :(得分:0)

原因是我想要定义自己的Main()方法,因此我将App.xaml文件中的.csproj文件标记从ApplicationDefition更改为简单{{ 1}}。这可行,但如果您还想以上述方式使用资源,则不行。

唯一的麻烦是VS不会就此发出警告,甚至会正确显示预览。将标记更改回Page可以解决问题,但是您需要找到另一种方法来定义自己的主方法。