Автоматически заморозить wpf-объекты, созданные из шаблонов - PullRequest
3 голосов
/ 17 июня 2010

Правильно ли, что объекты wpf, которые можно заморозить, в любом случае автоматически замораживаются, если они генерируются с помощью DataTemplate, ControlTemplate или стиля?

Ответы [ 2 ]

1 голос
/ 21 июня 2010

Я немного поиграл с кистями в моем 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 должен проверить, не затрагивает ли кисть анимацию, и делает это в момент первого использования. Но это только умозрительно. Я не делал никаких тестов с анимацией.

Исходя из замечаний старейшин к этой теме, я думаю, что на мой первоначальный вопрос можно ответить «да». Такое поведение кажется мне также логичным. Но ясно, что так мало тестов с одним типом ресурса также могут привести в совершенно неверном направлении. К сожалению, информации по этой теме не так много. Если у кого-то есть хорошие ссылки или я допустил явную ошибку в своих простых тестах, оставьте мне комментарий.

0 голосов
/ 18 июня 2010

Нет, я не думаю, что это правильно. Вам также необходимо явно заморозить эти объекты в XAML. Проверьте эти ссылки для получения подробной информации о том, как это сделать в XAML -

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

Как объекты WPF, полученные из Freezable, могут быть заморожены в XAML?

...