Automatically freeze wpf-objects built from templates
Is it right that wpf-objects that are freezable are freezed in any case automatically if they are generated through a DataTemplate, Contro开发者_开发技巧lTemplate or a style?
I played a little around with brushes in my VisualTree-Analyzer to see how the automatic freezing works. Here the result of my tests:
All Brushes that were attached through ControlTemplates, DataTemplates or Styles have been frozen, regardless if the declaring Brush in the template or in the style has been frozen.
For getting this, I checked the resulting visual tree of the following templates and styles:
<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>
As already remarked, the Brushes in the visual tree always were frozen.
Furthermore also the Brush of the setter in the style of the style-test was frozen, if the style has been used at least one time. I think this "one-time restriction" is because WPF must test if no animation touches the Brush and it does this on the moment of first use. But that’s only speculative. I haven’t done any test with animation.
Based on elder observations to this topic, I think my initial question may be answered with yes. Such a behavior seems to me also as logical. But it’s clear that so few tests with one type of resource also can lead in a totally wrong direction. Sadly, there’s not a lot of information about this topic available. If someone has some good links, or if I have made an obvious mistake in my simple tests, please leave me a comment.
No, I don't think that's right. You need to explicitly freeze these objects in XAML too. Check these links for details on how to do this in XAML -
http://msdn.microsoft.com/en-us/library/ms750509.aspx
How can WPF objects deriving from Freezable be frozen in XAML?
精彩评论