3

如果可冻结的 wpf 对象是通过 DataTemplate、ControlTemplate 或样式生成的,那么在任何情况下都会自动冻结它们是否正确?

4

2 回答 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 中执行此操作的详细信息 -

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

派生自 Freezable 的 WPF 对象如何在 XAML 中冻结?

于 2010-06-18T07:21:18.460 回答