2010-03-09 12 views
6

Ho un UserControl simile a questo:WPF UserControl non viene disegnato quando sovrascrivendo MeasureOverride e ArrangeOverride

<UserControl 
    MaxHeight="32" 
    MaxWidth="32" 
    MinHeight="25" 
    MinWidth="25"> 
    <DockPanel> 
     <!-- some stuff --> 
    </DockPanel> 
</UserControl> 

Oltre al vincolo formato min/max, voglio il controllo sempre essere verniciato con Width = Height. Così sovrascrivo MeasureOverride e ArrangeOverride:

protected override Size MeasureOverride(Size availableSize) 
{ 
    var resultSize = new Size(0, 0); 
    ((UIElement)Content).Measure(availableSize); 
    var sideLength = Math.Min(((UIElement)Content).DesiredSize.Width, ((UIElement)Content).DesiredSize.Height); 

    resultSize.Width = sideLength; 
    resultSize.Height = sideLength; 

    return resultSize; 
} 

protected override Size ArrangeOverride(Size finalSize) 
{ 
    ((UIElement)Content).Arrange(new Rect(0, 0, finalSize.Width, finalSize.Height)); 
    return finalSize; 
} 

ho capito che devo chiamare Measure e Arrange su ogni bambino di UserControl. Poiché DocPanel è l'unico figlio del mio UserControl e (a mio avviso) è archiviato nella proprietà Content di UserControl, è sufficiente chiamare Measure e Arrange su questa proprietà Content. Tuttavia UserControl non viene visualizzato. Che cosa sto facendo di sbagliato?

risposta

3

A seconda di come si ospita l'UserControl, il valore restituito dalla fase Misura non può essere utilizzato. Se lo hai configurato in una griglia con righe/colonne stellari o un DockPanel, la dimensione finale potrebbe essere completamente diversa.

È necessario applicare una logica simile alla fase di disposizione, quindi ignorerà in modo efficace qualsiasi spazio aggiuntivo che viene fornito.

Il seguente codice dovrebbe funzionare, ed è un po 'più pulito:

protected override Size MeasureOverride(Size availableSize) { 
    var desiredSize = base.MeasureOverride(availableSize); 
    var sideLength = Math.Min(desiredSize.Width, desiredSize.Height); 

    desiredSize.Width = sideLength; 
    desiredSize.Height = sideLength; 

    return desiredSize; 
} 

protected override Size ArrangeOverride(Size finalSize) { 
    var sideLength = Math.Min(this.DesiredSize.Width, this.DesiredSize.Height); 
    return base.ArrangeOverride(new Size(sideLength, sideLength)); 
} 
Problemi correlati