如何创建自定义WPF样式库

时间:2015-05-05 12:33:33

标签: c# xaml wpf-style

我正在尝试将我的WPF样式放在一个单独的库中,但有点失去了如何最好地实现这一点。这就是我到目前为止所做的:

  1. 创建了一个新的类库项目并添加了引用 PresentationCore PresentationFramework System.Xaml WindowsBase
  2. 在此类库项目中创建文件“MyStyles.xaml” 以下内容:

    <ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
    
        <Style TargetType="Button" x:Key="MyButtonStyle">
            <Setter Property="Background" Value="Transparent"/>
        </Style>
    </ResourceDictionary>
    
  3. 建立项目。

  4. 创建了一个新的WPF应用程序项目,并引用了该库 建在上面。

  5. 在App.xaml中,尝试引用libarary中的资源字典,如下所示:

    `<ApplicationResources>
    <ResourceDictionary>
        <ResourceDictionary.MergedDictionaries>
            <ResourceDictionary Source="pack://application:,,,/MyCustomWpfStyles;component/MyStyles.xaml"/>
        </ResourceDictionary.MergedDictionaries>
    </ResourceDictionary>
    

    `

  6. 此时VS intellisense告诉我发生了错误 在找到资源字典时,虽然是应用程序 建立没有问题。

  7. 即使我能够加载资源字典,我也不知道如何 与控件一起使用,例如<Button Style="What goes here??" />

  8. 通过互联网查看,但似乎找不到如何将样式打包到单独的dll中的好例子。有什么指针吗?

1 个答案:

答案 0 :(得分:2)

  1. 不要盲目信任VS智能,随时向您提供正确的错误消息。可能有问题,但我看到VS在所有情况下都无法在同一解决方案中处理多个项目。如果它只是一个警告,暂时忽略。如果它是一个正确的错误并且无法编译,请在单独的解决方案中构建控件库,并在客户端应用程序中设置对dll的正确引用。

  2. 使用Style="{StaticResource MyButtonStyle}"

  3. 另请参阅ResourceDictionary in a separate assembly它解释了如何在其他类型的程序集和其他位置使用资源。

    以下是可在我的机器上运行的代码:

    在类库项目WpfControlLibrary1中,名为&#34; Dictionary1.xaml&#34;的根文件夹中的文件:

    <ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
        <Style TargetType="Button"
               x:Key="Demo1">
            <Setter Property="BorderBrush"
                    Value="Red" />
            <Setter Property="BorderThickness"
                    Value="10" />
            <Setter Property="Background"
                    Value="Transparent" />
        </Style>
    </ResourceDictionary>
    

    请注意,当用于绘制按钮的模板不使用Background属性时,设置Background属性可能不起作用。 WPF在Windows 7上使用的花哨渐变按钮模板不会这样做,但Windows 8.1上的平面按钮模板不会这样做。这就是为什么我添加了一个大的红色边框,以便样式可能部分显示。

    在另一个解决方案中,一个Wpf应用程序引用了前一个dll(而不是项目)

    <Window x:Class="WpfApplication1.MainWindow"
            xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
            xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
            Title="MainWindow"
            Height="350"
            Width="525">
        <Window.Resources>
            <ResourceDictionary>
                <ResourceDictionary.MergedDictionaries>
                    <ResourceDictionary Source="pack://application:,,,/WpfControlLibrary1;component/Dictionary1.xaml" />
                </ResourceDictionary.MergedDictionaries>
            </ResourceDictionary>
        </Window.Resources>
        <Grid>
            <Button Content="Button"
                    Style="{StaticResource ResourceKey=Demo1}"
                    HorizontalAlignment="Left"
                    Margin="139,113,0,0"
                    VerticalAlignment="Top"
                    Width="75" />
        </Grid>
    </Window>
    

    将合并的字典移动到app对象也可以:

    <Application x:Class="WpfApplication1.App"
                 xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                 xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
                 StartupUri="MainWindow.xaml">
        <Application.Resources>
            <ResourceDictionary>
                <ResourceDictionary.MergedDictionaries>
                    <ResourceDictionary Source="pack://application:,,,/WpfControlLibrary1;component/Dictionary1.xaml" />
                </ResourceDictionary.MergedDictionaries>
            </ResourceDictionary>
        </Application.Resources>
    </Application>