如果可冻结的 wpf 对象是通过 DataTemplate、ControlTemplate 或样式生成的,那么在任何情况下都会自动冻结它们是否正确?
问问题
2081 次
2 回答
1
我在 VisualTree-Analyzer 中使用了一些画笔,看看自动冻结是如何工作的。这是我的测试结果:
通过 ControlTemplates、DataTemplates 或 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>
如前所述,视觉树中的画笔总是被冻结。
此外,如果样式已使用至少一次,则样式测试样式中的二传手画笔也会被冻结。我认为这种“一次性限制”是因为 WPF 必须测试是否没有动画接触画笔,并且它会在第一次使用时执行此操作。但这只是推测。我还没有对动画进行任何测试。
根据对这个话题的老观察,我认为我最初的问题可能会得到肯定的回答。这种行为在我看来也是合乎逻辑的。但很明显,对一种资源进行如此少的测试也会导致完全错误的方向。遗憾的是,关于这个主题的可用信息并不多。如果有人有一些好的链接,或者我在简单的测试中犯了明显的错误,请给我留言。
于 2010-06-20T21:54:55.843 回答
0
不,我认为这是不对的。您还需要在 XAML 中显式冻结这些对象。检查这些链接以获取有关如何在 XAML 中执行此操作的详细信息 -
于 2010-06-18T07:21:18.460 回答