2010-06-17 6 views
3

Est-il vrai que wpf-objets qui sont freezable sont automatiquement gelés dans tous les cas s'ils sont générés par un DataTemplate, un ControlTemplate ou un style?Geler automatiquement les objets wpf construits à partir de modèles

+0

Cela peut également dépendre de la version du framework .Net utilisée par votre application. Nous avons tenté de mettre à niveau une application WPF de la version 3.5 à la version 4.0 et rencontré une exception XamlParseException avec un message indiquant que 'doit avoir IsFrozen défini sur false pour modifier'. Nous n'avons jamais explicitement appelé la méthode Freeze() sur un objet. –

Répondre

1

J'ai joué un peu autour avec des brosses dans mon VisualTree-Analyzer pour voir comment fonctionne le gel automatique. Voici le résultat de mes tests:

Tous les pinceaux liés à ControlTemplates, DataTemplates ou Styles ont été gelés, que le pinceau déclarant dans le modèle ou dans le style ait été gelé.


Pour obtenir cela, j'ai vérifié l'arbre résultant visuel des modèles et des styles suivants:

<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> 

Comme nous l'avons fait remarquer, les pinceaux dans l'arbre visuel ont été gelés toujours.

En outre, le pinceau du setter dans le style du test de style a été gelé, si le style a été utilisé au moins une fois. Je pense que cette "restriction ponctuelle" est due au fait que WPF doit tester si aucune animation ne touche le pinceau et cela au moment de la première utilisation. Mais ce n'est que spéculatif. Je n'ai fait aucun test avec animation.

D'après les observations de personnes âgées à ce sujet, je pense que ma question initiale peut être répondu par oui. Un tel comportement me semble aussi logique. Mais il est clair que si peu de tests avec un type de ressource peuvent aussi conduire dans une direction totalement fausse. Malheureusement, il n'y a pas beaucoup d'informations sur ce sujet disponible. Si quelqu'un a de bons liens, ou si j'ai fait une erreur évidente dans mes tests simples, s'il vous plaît laissez-moi un commentaire.

0

Non, je ne pense pas que ce soit juste. Vous devez aussi geler explicitement ces objets dans XAML. Vérifiez ces liens pour plus de détails sur la façon de le faire en XAML -

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

How can WPF objects deriving from Freezable be frozen in XAML?

+0

La question/autre réponse ne concerne généralement pas les freezables dans XAML, il fait spécifiquement référence aux modèles et aux styles - auquel cas il s'agit d'une copie de l'objet original qui nous intéresse. –

Questions connexes