2009-05-19 6 views
9

Le Microsoft example code suivant contient les éléments suivants:WPF Border DesiredHeight

<Grid> 
...  
    <Border Name="Content" ... > 
...  
    </Border> 
</Grid> 
<ControlTemplate.Triggers> 
    <Trigger Property="IsExpanded" Value="True"> 
    <Setter TargetName="ContentRow" Property="Height" 
      Value="{Binding ElementName=Content,Path=DesiredHeight}" /> 
    </Trigger> 
... 
</ControlTemplate.Triggers> 

Lorsque l'exécution, cependant, ce code génère l'erreur de liaison de données suivante:

System.Windows.Data Error: 39 : BindingExpression path error: 'DesiredHeight' property not found on 'object' ''Border' (Name='Content')'. BindingExpression:Path=DesiredHeight; DataItem='Border' (Name='Content'); target element is 'RowDefinition' (HashCode=2034711); target property is 'Height' (type 'GridLength') 

Malgré cette erreur, le code fonctionne correctement. J'ai regardé à travers la documentation et DesiredHeight ne semble pas être un membre de Border. Quelqu'un peut-il expliquer d'où vient DesiredHeight? Aussi, est-il possible de résoudre/supprimer cette erreur afin que ma sortie de programme soit propre?

Répondre

8

Vous pouvez voir cette propriété dans la partie de code de votre application

Edit:

Border content = new Border(); 
int desiredHeight = content.DesiredSize.Height; 
int desiredWidth = content.DesiredSize.Width; 

Pour résoudre le problème, essayez la liant à l'attribut de hauteur, puisque DesiredHeight ne semble pas être disponible dans le balisage XAML du contrôle Border.

+0

D'accord, cela fonctionne (bien que DesiredSize.Height est un double). Donc, DesiredHeight ne fait que mapper à Border.DesiredSize.Height? Est-ce une sorte de propriété sans-papiers? –

+0

Je suis sûr que ce n'est pas non documenté, le fait est que les contrôles XAML se dimensionnent en fonction de leur contenu, même si vous définissez la hauteur à 100, il peut changer pour toute autre raison, et la nouvelle hauteur et largeur seront contenues dans le Les propriétés ActualHeight et ActualWidth respectivement. Si vous souhaitez que vos contrôles aient une taille fixe, vous devez plutôt définir MinWidth et MinHeight, mais la plupart du temps, je ne le recommande pas. Principalement tout cela est de résoudre les problèmes de redimensionnement que nous avions avec WindowsApplications. – Carlo

2

Je suis venu sur le même problème dans ma demande. À la fin, j'ai changé le code de sorte que j'ai basculé la visibilité du contenu entre Collapsed et Visible, et remplacé le Grid avec un StackPanel.

J'ai généralement trouvé que la qualité des échantillons de modèles de contrôle MS était plutôt bonne, mais l'erreur avec celle-ci était un peu frustrante.

1

DesiredHeight provient de l'élément de contenu et il s'agit d'une liaison valide. Je pense que la raison pour laquelle votre liaison n'est pas résolue est que DesiredHeight repose sur la propriété Height et que vous n'avez pas défini de hauteur fixe dans votre modèle. Elle est évaluée à Double.Nan

4

J'ai rencontré ce problème. Le long de ce que dit user275587, leur exemple fonctionne parce que le déclencheur supprime Heigth = "0" dans RowDefination.

Je changer le réglage de la hauteur/logique de déclenchement, de sorte que le RowDefination n'a pas fixé la hauteur

<Grid.RowDefinitions> 
    <RowDefinition Height="Auto"/> 
    <RowDefinition Name="ContentRow" /> 
</Grid.RowDefinitions> 
... 
<ControlTemplate.Triggers> 
    <Trigger Property="IsExpanded" Value="False"> 
      <Setter TargetName="ContentRow" Property="Height" Value="0" /> 
    </Trigger> 
</ControlTemplate.Triggers> 
2

Même problème, mais la solution acceptée par Carlo ne fonctionne pas parfaitement. Le problème que l'affiche était confronté disparaît mais l'Expander partiellement pauses-

si vous avez un contenu qui a besoin de se développer dans un dispositif d'expansion déjà étendu, il ne le fera pas avec la liaison à DesiredSize.Height, vous avez besoin DesiredHeight - peut être due à une raison donnée par user275587.

2

Essayez-le.

<Setter 
    TargetName="content" 
    Property="Height" 
    Value="{Binding ElementName=content, Path=DesiredHeight}" 
/> 
    ↓ 
<Setter TargetName="content" Property="Height" Value="NaN"/> 

La liaison est inutile.

2

A eu le même problème. Était en utilisant un Expander personnalisé dans un personnalisé ComboBox. Aucun de ce qui précède a fonctionné pour moi, la liaison à Height a cassé la fonctionnalité du Expander, en utilisant un StackPanel a également cassé l'affichage des éléments de chaque groupe.J'ai trouvé:

<Setter TargetName="ContentRow" Property="Height" Value="Auto"/> 
+0

Cela fonctionne pour moi, et est probablement la meilleure réponse, car en utilisant Auto efficacement utilisera le DesiredHeight, mais avec la liaison la plus concise. –

+0

J'avais besoin de Value = "*" mais oui cela fonctionne –

Questions connexes