1

windows 、ボタンの基本的なテンプレートのいくつかと、プロジェクトで後で使用するための別の新しい衣装コントロールとテンプレートを含むライブラリ (WPF を使用) を作成しようとしています。

私はまだ WPF に慣れていません。外部ライブラリに新しい ResourceDictionary を作成し、そこにすべてのスタイルとその動的変数を配置する必要があることを理解しました。その後、メイン アプリケーション プロジェクトで MergedResourceDictionary を作成します。これにより、通常のスタイルとコントロールを使用できるようになります。

さて、2 つの変数を DynamicResource として使用するテンプレートを使用して、基本的な実験的なスタイルを作成することに成功しました<Brush x:Key="brush_back_standard">RoyalBlue</Brush>。これ は 通常 の バック 着色 に 使用 さ れ ます . 次に、スタイル自体でこのブラシを動的に使用することを宣言しました<Grid Background="{DynamicResource brush_back_standard}">

私の問題は、ブラシの値をランタイムに変更しようとしているときに始まります: Style.Resources[ "brush_back_standard" ] = Brushes.Aqua;. ユーザーが後で実行時にアプリケーションの設定でテーマを変更するケースをシミュレートします。だからそれはまったくうまくいきませんでした、そして私は例外を得ました: ResourceDictionary is read-only and cannot be modified.。したがって、それが本当に読み取り専用である場合、ユーザーは実行時にテンプレートを変更できないため、私には役に立たない. 実行時にユーザーがウィンドウ テンプレートの内容を変更できるようにする方法を見つける必要があります。

完全なスタイル コード (外部ライブラリ) :

<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:system="clr-namespace:System;assembly=mscorlib">
<Style x:Key="window_standard"
       TargetType="{x:Type Window}">
    <Style.Resources>
        <system:Double x:Key="thickness_shadow">10</system:Double>
        <Brush x:Key="brush_back_standard">RoyalBlue</Brush>
    </Style.Resources>
    <Setter Property="WindowStyle"
            Value="None" />
    <Setter Property="AllowsTransparency"
            Value="True" />
    <Setter Property="BorderThickness"
            Value="{DynamicResource thickness_shadow}" />
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type Window}">
                <Grid Background="{DynamicResource brush_back_standard}">
                    <AdornerDecorator>
                        <ContentPresenter />
                    </AdornerDecorator>
                    <ResizeGrip x:Name="WindowResizeGrip"
                                HorizontalAlignment="Right"
                                VerticalAlignment="Bottom"
                                Visibility="Collapsed"
                                IsTabStop="false" />
                </Grid>
                <ControlTemplate.Triggers>
                    <Trigger Property="ResizeMode"
                             Value="CanResizeWithGrip">
                        <Setter TargetName="WindowResizeGrip"
                                Property="Visibility"
                                Value="Visible" />
                    </Trigger>
                </ControlTemplate.Triggers>
            </ControlTemplate>
        </Setter.Value>
        </Setter>
</Style>

私のメインアプリケーションプロジェクトでライブラリにアクセスする:

<Application x:Class="diamond.sandbox.executer"
         xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
         StartupUri="window_main.xaml">
<Application.Resources>
    <ResourceDictionary>
        <ResourceDictionary.MergedDictionaries>
            <ResourceDictionary Source="pack://application:,,,/diamond.core;component/xaml/standard.xaml" />
        </ResourceDictionary.MergedDictionaries>
    </ResourceDictionary>
</Application.Resources>

style によって魔法のように影響を受ける window_main.xaml:

<Window x:Class="diamond.sandbox.window_main"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="window_main" Height="250" Width="500"
    Style="{DynamicResource window_standard}"
    WindowStartupLocation="CenterScreen"
    Loaded="initialise">

初期化メソッド (window_main がロードされた後):

private void initialise( object p_sender , RoutedEventArgs p_args )
    {
        Style.Resources[ "brush_back_standard" ] = Brushes.Aqua;
    }
4

1 に答える 1