2009-05-19 17 views
9

Il seguente Microsoft example code contiene quanto segue: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> 

Quando termine, 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 esaminato la documentazione e DesiredHeight non sembra essere un membro di Border. Qualcuno può spiegare da dove proviene DesiredHeight? Inoltre, c'è un modo per risolvere/sopprimere questo errore, quindi l'output del mio programma è pulito?

risposta

8

Si può vedere che la proprietà nella parte di codice dell'applicazione

Edit:

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

Per risolvere il problema, prova vincolante per l'attributo altezza, dal momento che DesiredHeight non sembra essere disponibile nel markup XAML del controllo Border.

+0

Va bene, che funziona (anche se DesiredSize.Height è una doppia). Quindi DesiredHeight si limita a mappare a Border.DesiredSize.Height? Questa è una sorta di proprietà non documentata? –

+0

Sono sicuro che non è documentato, il fatto è che XAML controlla le dimensioni stesse in base al loro contenuto, anche se si imposta l'altezza su 100, potrebbe cambiare per qualsiasi altra ragione, e la nuova altezza e larghezza saranno contenute nel Proprietà ActualHeight e ActualWidth, rispettivamente. Se vuoi che i tuoi controlli abbiano una dimensione fissa, devi invece impostare MinWidth e MinHeight, ma la maggior parte delle volte non lo consiglio. Principalmente tutto ciò è per risolvere i problemi di ridimensionamento che abbiamo avuto con WindowsApplications. – Carlo

2

Mi sono imbattuto nello stesso problema nella mia domanda. Alla fine ho cambiato il codice in modo che ho attivato la visibilità del contenuto tra Collapsed e Visible e sostituito lo Grid con uno StackPanel.

In genere ho riscontrato che la qualità dei campioni del modello di controllo MS è piuttosto buona, ma l'errore con questo è stato un po 'frustrante.

1

DesiredHeight proviene dall'elemento di contenuto ed è un bind valido. Penso che il motivo per cui la tua associazione non si risolve sia perché DesiredHeight si basa sulla proprietà Height e non hai impostato un'altezza fissa nel modello in modo tale da valutare Double.Nan

4

Mi sono imbattuto in questo. Sulla falsariga di ciò che dice user275587, il loro esempio funziona perché il trigger rimuove l'Heigth = "0" su RowDefination.

Così ho cambiare la logica di regolazione dell'altezza/grilletto, in modo che il RowDefination non ha impostato Altezza

<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

stesso problema, ma la soluzione accettata da Carlo non funzionare perfettamente. Il problema che il manifesto è stato rivolto va via ma l'Expander parzialmente breaks-

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 a un motivo fornito dall'utente275587.

2

Provalo.

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

Binding è inutile.

2

Aveva lo stesso problema. Stavo usando una custom Expander in un'utenza ComboBox. Nessuno dei precedenti ha funzionato per me, il binding a Height ha interrotto la funzionalità di Expander, utilizzando uno StackPanel ha anche rotto la visualizzazione degli elementi in ciascun gruppo.Ho trovato:

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

Questo funziona per me, ed è probabilmente la migliore risposta, dal momento che l'utilizzo di Auto in modo efficace utilizzerà il DesiredHeight, ma con il binding più conciso. –

+0

Avevo bisogno di Valore = "*" ma sì, questo funziona –