WPF Border DesiredHeight
-
22-08-2019 - |
Frage
Der folgende Microsoft Beispielcode folgendes enthält:
<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>
Wenn er ausgeführt wird, aber dieser Code generiert die folgende Datenbindung Fehler:
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')
Trotz dieses Fehlers funktioniert der Code korrekt. Ich habe durch die Dokumentation geschaut und DesiredHeight
erscheint nicht Mitglied in Border
zu sein. Kann mir jemand erklären, wo DesiredHeight
herkommt? Auch ist es eine Möglichkeit, zu lösen / unterdrücken diese Fehler so mein Programm Ausgabe ist sauber?
Lösung
Sie können diese Eigenschaft im Codeteil Ihrer Anwendung finden Sie unter
Edit:
Border content = new Border();
int desiredHeight = content.DesiredSize.Height;
int desiredWidth = content.DesiredSize.Width;
Um das Problem zu lösen versuchen, es auf die Höhe Attribut zu binden, da DesiredHeight nicht in dem XAML-Markup der Grenzkontrolle verfügbar zu sein scheint.
Andere Tipps
Ich habe in dieser läuft. Nach dem Vorbild von dem, was user275587 sagte, ihr Beispiel funktioniert, weil der Auslöser die Heigth = „0“ auf der RowDefination entfernt.
Also habe ich die Höheneinstellung / Trigger-Logik-Schalter, so dass die RowDefination hat keine Höhe festgelegt
<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>
Versuchen Sie es.
<Setter
TargetName="content"
Property="Height"
Value="{Binding ElementName=content, Path=DesiredHeight}"
/>
↓
<Setter TargetName="content" Property="Height" Value="NaN"/>
Die Bindung ist nicht erforderlich.
kam ich auf das gleiche Problem in meiner Anwendung auf. Am Ende änderte ich den Code, so dass ich die Sichtbarkeit des Inhalts zwischen Collapsed
und Visible
umgeschaltet, und ersetzt den Grid
mit einem StackPanel
.
Ich habe festgestellt, im Allgemeinen der Qualität der MS Kontrolltemplate Proben ziemlich gut zu sein, aber der Fehler mit diesem war ein wenig frustrierend.
Die gleiche Problem, aber die akzeptierte Lösung von Carlo perfekt funktioniert nicht. Das Problem, das das Plakat war mit Blick geht weg, aber der Expander teilweise bricht -
Wenn Sie einige Inhalte haben, die in einem bereits erweitert Expander erweitern muss, wird es nicht so tun, mit der Bindung an DesiredSize.Height , müssen Sie DesiredHeight - könnte sein wegen einem Grund von user275587 gegeben.
das gleiche Problem hat. War eine benutzerdefinierte Expander
in einem benutzerdefinierten ComboBox
verwenden.
Keines der oben genannten arbeitete für mich, die Bindung an Height
brach die Funktionalität des Expander
unter Verwendung eines StackPanel
auch die Anzeige der Elemente in jeder Gruppe brach. Ich fand:
<Setter TargetName="ContentRow" Property="Height" Value="Auto"/>
DesiredHeight kommt von Content-Elemente und es ist eine gültige Bindung. Ich denke, der Grund, Ihre Bindung löst nicht ist, weil DesiredHeight auf Height-Eigenschaft beruht, und Sie haben keine feste Größe in der Vorlage festgelegt, so dass es zu Double.NaN auswertet