2010-03-09 2 views
6

Ich habe ein Usercontrol wie folgt aussehen:WPF Usercontrol nicht gezogen wird, wenn zwingende MeasureOverride und ArrangeOverride

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

Neben der Min-/Max-Größe Einschränkung, möchte ich die Kontrolle immer mit Width = Height gemalt. So überschreiben i MeasureOverride und 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; 
} 

Ich verstehe, dass ich Measure und Arrange auf jedes Kind von dem Usercontrol nennen müssen. Da das DocPanel das einzige Kind meines Benutzersteuerelements ist und meines Wissens nach in der Content-Eigenschaft des UserControl gespeichert ist, rufe ich einfach Measure und Arrange für diese Content-Eigenschaft auf. Das UserControl wird jedoch nicht angezeigt. Was mache ich falsch?

Antwort

3

Je nachdem, wie Sie Ihr UserControl hosten, wird der von der Measure-Phase zurückgegebene Wert möglicherweise nicht verwendet. Wenn Sie es in einem Raster mit Sternzeilen/-spalten oder einem DockPanel einrichten, ist die endgültige Größe möglicherweise völlig anders.

Sie müssten eine ähnliche Logik in der Arrangierphase anwenden, so dass zusätzlicher Platz, den sie erhalten, ignoriert wird.

Der folgende Code sollte funktionieren, und ist etwas sauberer:

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)); 
}