WPF Border DesiredHeight
-
22-08-2019 - |
Domanda
Il seguente codice di esempio Microsoft contiene quanto segue:
<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>
Quando viene eseguito, tuttavia, questo codice genera il seguente errore di associazione dati:
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')
Nonostante questo errore, il codice funziona correttamente. Ho guardato attraverso la documentazione e DesiredHeight
non sembra essere un membro di Border
. Qualcuno può spiegare dove DesiredHeight
è venuta da? Inoltre, c'è un modo per risolvere / sopprimere questo errore quindi il mio output del programma è pulito?
Soluzione
Si può vedere che la proprietà nella parte di codice dell'applicazione
Modifica:
Border content = new Border();
int desiredHeight = content.DesiredSize.Height;
int desiredWidth = content.DesiredSize.Width;
Per risolvere il problema provare legandolo all'attributo altezza, dal momento che DesiredHeight non sembra essere disponibile nel markup XAML del controllo di frontiera.
Altri suggerimenti
Ho incontrato questo. Lungo le linee di quello che user275587 detto, il loro esempio funziona perché il grilletto rimuove l'Altezza = "0" sul RowDefination.
Così posso passare la logica di impostazione altezza / grilletto, in modo che il RowDefination non ha Altezza set
<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>
Da provare.
<Setter
TargetName="content"
Property="Height"
Value="{Binding ElementName=content, Path=DesiredHeight}"
/>
↓
<Setter TargetName="content" Property="Height" Value="NaN"/>
legame è inutile.
Sono venuto sullo stesso problema nella mia applicazione. Alla fine ho cambiato il codice in modo che basculare la visibilità del contenuto tra Collapsed
e Visible
, e sostituito il Grid
con un StackPanel
.
Sono generalmente trovato la qualità dei campioni di modelli di controllo MS per essere abbastanza buono, ma l'errore con questo era un po 'frustrante.
Lo stesso problema, ma la soluzione accettata da Carlo non funziona perfettamente. Il problema che il manifesto è stato rivolto va via ma l'Expander parzialmente rompe -
se si dispone di alcuni contenuti che ha bisogno di espandersi in un espansore già espanso, esso non farlo con l'Associazione a DesiredSize.Height , è necessario DesiredHeight - potrebbe essere dovuto ad una ragione data dal user275587.
Ha avuto lo stesso problema. Usando un Expander
personalizzato in una ComboBox
personalizzato.
Nessuno dei precedenti ha lavorato per me, il legame con Height
ha rotto la funzionalità del Expander
, utilizzando un StackPanel
anche rotto la visualizzazione degli oggetti in ogni gruppo. Ho trovato:
<Setter TargetName="ContentRow" Property="Height" Value="Auto"/>
DesiredHeight viene da elemento di contenuto ed è un legame valido. Penso che il motivo per il vostro legame non risolve perché DesiredHeight si basa sulla proprietà di altezza e non è stato fissato un altezza fissa nel modello in modo che restituisce Double.NaN