4

我试图将我的 WPF 样式放在一个单独的库中,但对于如何最好地实现这一点有点迷茫。这是我到目前为止所做的:

  1. 创建了一个新的类库项目并添加了引用 PresentationCorePresentationFrameworkSystem.XamlWindowsBase
  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 中尝试引用库中的资源字典,如下所示:

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

    `

  6. 此时 VS intellisense 告诉我们在查找资源字典时发生错误,尽管应用程序构建没有问题。

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

查看互联网,但似乎找不到如何将样式打包到单独的 dll 中的好例子。任何指针?

4

1 回答 1

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

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

还可以在单​​独的程序集中查看ResourceDictionary它解释了如何在其他类型的程序集中和其他位置使用资源。

这是适用于我的机器的代码:

在类库项目 WpfControlLibrary1 中,根文件夹中有一个名为“Dictionary1.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="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>
于 2015-05-05T12:43:13.737 回答