3

フリーズ可能なwpf-objectsが、DataTemplate、ControlTemplate、またはスタイルを介して生成された場合、どのような場合でも自動的にフリーズされるのは正しいですか?

4

2 に答える 2

1

VisualTree-Analyzerでブラシを少し試して、自動フリーズがどのように機能するかを確認しました。ここに私のテストの結果があります:

テンプレートまたはスタイルで宣言しているブラシがフリーズされているかどうかに関係なく、ControlTemplates、DataTemplates、またはスタイルを介してアタッチされたすべてのブラシがフリーズされています。


これを取得するために、次のテンプレートとスタイルの結果のビジュアルツリーを確認しました。

<DataTemplate x:Key="Test_DataTemplate">
    <Grid> 
        <!-- Explicit creation to ensure Brush is !IsFrozen through the converter-->
        <Grid.Background> 
            <SolidColorBrush Color="Red"/>
        </Grid.Background>
        <TextBlock Text="{Binding}"/>
    </Grid>
</DataTemplate>

<ControlTemplate x:Key="Test_ControlTemplate"  TargetType="{x:Type ContentControl}">
    <Border >
        <Border.Background>
            <SolidColorBrush Color="Green" />
        </Border.Background>
        <ContentPresenter />
    </Border>
</ControlTemplate/>

<Style x:Key="Test_Style" TargetType="TextBlock">
    <Setter Property="Background" >
        <Setter.Value>
            <SolidColorBrush Color="Yellow" />                    
        </Setter.Value>                
    </Setter>
</Style>   

<TextBlock >
    <TextBlock.Style>
    <Style TargetType="TextBlock">
        <Setter Property="Background" >
            <Setter.Value>
                <SolidColorBrush Color="Violet" />                    
            </Setter.Value>                
        </Setter>
    </Style>
    </TextBlock.Style>            
</TextBlock>

すでに述べたように、ビジュアルツリーのブラシは常にフリーズしていました。

さらに、スタイルが少なくとも1回使用されている場合は、スタイルテストのスタイルのセッターのブラシもフリーズしました。この「1回限りの制限」は、アニメーションがブラシに触れていないかどうかをWPFがテストする必要があり、最初の使用時にこれを行うためだと思います。しかし、それは推測にすぎません。アニメーションでのテストは行っていません。

このトピックに対する高齢者の観察に基づいて、私の最初の質問は「はい」で答えられるかもしれないと思います。そのような振る舞いは私にも論理的であるように思われます。しかし、1つのタイプのリソースを使用したテストが非常に少ないため、まったく間違った方向に進む可能性があることは明らかです。残念ながら、このトピックに関する情報はあまりありません。誰かが良いリンクを持っている場合、または私が簡単なテストで明らかな間違いを犯した場合は、コメントを残してください。

于 2010-06-20T21:54:55.843 に答える
0

いいえ、そうではないと思います。XAMLでもこれらのオブジェクトを明示的にフリーズする必要があります。XAMLでこれを行う方法の詳細については、これらのリンクを確認してください-

http://msdn.microsoft.com/en-us/library/ms750509.aspx

Freezableから派生したWPFオブジェクトをXAMLでフリーズするにはどうすればよいですか?

于 2010-06-18T07:21:18.460 に答える