フリーズ可能なwpf-objectsが、DataTemplate、ControlTemplate、またはスタイルを介して生成された場合、どのような場合でも自動的にフリーズされるのは正しいですか?
2 に答える
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つのタイプのリソースを使用したテストが非常に少ないため、まったく間違った方向に進む可能性があることは明らかです。残念ながら、このトピックに関する情報はあまりありません。誰かが良いリンクを持っている場合、または私が簡単なテストで明らかな間違いを犯した場合は、コメントを残してください。
いいえ、そうではないと思います。XAMLでもこれらのオブジェクトを明示的にフリーズする必要があります。XAMLでこれを行う方法の詳細については、これらのリンクを確認してください-