4

私は自分の WPF スタイルを別のライブラリに配置しようとしていますが、これをどのように達成するのが最善かについて少し迷っています。これは私がこれまでに行ったことです:

  1. 新しいクラス ライブラリ プロジェクトを作成し、参照を追加しました PresentationCorePresentationFrameworkSystem.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 で、次のようにライブラリ内のリソース ディクショナリを参照しようとしました。

    `<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 プロパティの設定が機能しない可能性があることに注意してください。Windows 7 で WPF が使用する派手なグラデーション ボタン テンプレートはそれを行いませんが、Windows 8.1 のフラットなボタン テンプレートは行います。そのため、スタイルが部分的に表示されるように、大きな赤い枠を追加しました。

別のソリューションでは、以前の dll (プロジェクトではない) を参照する Wpf アプリケーション

<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>

マージされた辞書をアプリ オブジェクトに移動することも同様に機能します。

<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 に答える