0

私は以下のように私のXamlを持っています

<Window.Resources>
    <SolidColorBrush x:Key="BrushMe" Color="Red"/>
    <SolidColorBrush x:Key="FreezeBrushMe" po:Freeze="true"  Color="Yellow"/>
</Window.Resources>
<StackPanel>        
    <Button Background="{StaticResource BrushMe}">Static</Button>
    <Button Background="{DynamicResource BrushMe}">Dynamic</Button>
    <Button Click="Button_Click">ChangeColorProperty</Button>
    <Button Click="Button1_Click">ChangeBrushObject</Button>
    <!--<Button Background="{StaticResource NotExistResource}" Click="Button_Click_1">GenerateResourceForStatic</Button>-->
    <Button Background="{DynamicResource NotExistResource}" Click="Button_Click_1">GenerateResourceForDynamic</Button>
    <Button Background="Green" Click="Button_Click_1">FixedBrush</Button>
    <Button Background="{StaticResource FreezeBrushMe}">FreezeBrushStatic</Button>
    <Button Background="{DynamicResource FreezeBrushMe}">FreezeBrushDynamic</Button>
    <Button Click="Button_Click_2">ChangeFreezeColorProperty</Button>
    <Button Click="Button_Click_3">ChangeFreezeBrushObject</Button>
</StackPanel>

私のコードビハインドでは、次のようになります

    private void Button_Click(object sender, RoutedEventArgs e)
    {
        SolidColorBrush brush = (SolidColorBrush)this.FindResource("BrushMe");
        brush.Color = Colors.Blue;
        this.Resources["BrushMe"] = brush;
    }

    private void Button1_Click(object sender, EventArgs e)
    {
        SolidColorBrush newBrush = new SolidColorBrush(Colors.Yellow);
        this.Resources["BrushMe"] = newBrush;
    }

    private void Button_Click_1(object sender, RoutedEventArgs e)
    {
        this.Resources.Add("NotExistResource", new SolidColorBrush(Colors.Green));
    }

    private void Button_Click_2(object sender, RoutedEventArgs e)
    {
        SolidColorBrush brush = (SolidColorBrush)this.FindResource("FreezeBrushMe");
        brush.Color = Colors.Blue;
        this.Resources["FreezeBrushMe"] = brush;
    }

    private void Button_Click_3(object sender, RoutedEventArgs e)
    {
        SolidColorBrush newBrush = new SolidColorBrush(Colors.Red);
        this.Resources["FreezeBrushMe"] = newBrush;
    }

私の質問は、最初に ChangeBrushObject ボタンをクリックすると、動的ボタンが黄色に変更され、次に ChangeColorProperty ボタンをクリックすると、動的ボタンが青色に変更されるだけで、静的ボタンには影響しません。

ただし、ChangeColorProperty ボタンを単独でクリックすると、静的ボタンと動的ボタンの両方が青に変わります。

なぜこのように振る舞うのですか?コントロールによって静的リソースとして参照されているリソースに新しいオブジェクトを割り当てようとすると、WPF は警告をスローしませんか?

また、動的リソースによって参照される存在しないリソースもテストしました。予想どおり、StaticResource が存在しないリソースを参照する場合、Xaml はコンパイル時に文句を言いますが、DynamicResource は文句を言いません。ただし、GenerateResourceForDynamic ボタンをクリックすると、背景として緑色が表示されますが、フェードアウトして再び表示され、繰り返されます。なぜこのようなことが起こるのですか?

編集: Freeze リソースを追加しました。奇妙な動作が再び発生しました。ChangeFreezeColorProperty ボタンをクリックすると、例外が発生します。ChangeFreezeBrushObject だけをクリックすると、FreezeBrushDynamic ボタンの色が変わります。ただし、ChangeFreezeBrushObject をクリックしてから ChangeFreezeColorProperty をクリックしても、例外はスローされません。

リソースをフリーズさせると、リソースにリンクされたオブジェクトのプロパティが読み取り専用になると思います。そのため、プロパティを変更すると、読み取り専用状態について不平を言う例外が発生します。ただし、凍結によってオブジェクト自体の変更が妨げられることはありません。

4

0 に答える 0