2011-04-27 2 views
4

Probablement un titre de question prêtant à confusion.Pourquoi mes panneaux sont-ils coupés tout autour du panneau lorsqu'ils sont plus petits que la taille explicite?

La grille avec le rectangle rouge est un exemple de ce à quoi il devrait ressembler.

La grille avec le rectangle bleu (n'apparaissant pas dans l'image) a une marge qui force la deuxième grille à être plus petite que je l'ai explicitement définie. Ce qui semble amener WPF à retourner et à cacher tout en dehors de ses limites arrangées.

enter image description here

J'ai essayé de placer le clip pour être plus grande que la grille. La seule façon que j'ai pu éviter est d'écrire un panneau personnalisé qui mesure ses enfants avec une contrainte de PositiveInfinity, mais arrange ensuite les enfants avec la bonne largeur. Cette méthode a beaucoup de problèmes. Ce n'est pas bon de mentir à vos enfants.

Quoi qu'il en soit, voici le code:

<Window 
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
x:Class="NegativeMarginTooMuchClipping.MainWindow" 
x:Name="Window" 
Title="MainWindow" 
Width="640" 
Height="400"> 

<Grid> 
    <StackPanel Width="600" Height="300"> 
    <Grid Margin="40,50,60,50" Background="#FFB8B8B8" Width="500" Height="50"> 
     <Rectangle Fill="Red" HorizontalAlignment="Left" Height="50" VerticalAlignment="Top" Width="50" Margin="0,-50,0,0"/> 
    </Grid> 
    <Grid Margin="40,50,61,50" Background="#FFB8B8B8" Width="500" Height="50"> 
     <Rectangle Fill="Blue" HorizontalAlignment="Left" Height="50" VerticalAlignment="Top" Width="50" Margin="0,-50,0,0"/> 
    </Grid> 
    </StackPanel> 
</Grid> 

Problème connu? Est-ce que je le fais mal? Besoin de plus de précisions?

+0

D'abord, vous déplacez le rectangle bleu en dehors de la grille, puis vous le déplacez même à travers les limites StackPanel, le rectangle bleu n'est pas amusé. –

Répondre

8

Il y a trois choses qui entrent en ligne de compte pour déterminer comment un élément se clipse. Les deux premiers sont ClipToBounds et Clip, mais le troisième est un peu plus ennuyeux et c'est GetLayoutClip.

Par défaut, pour UIElement la méthode GetLayoutClip renvoie soit null, soit un RectangleGeometry de la même taille que l'élément, en fonction de la propriété ClipToBounds. FrameworkElement, et ses dérivations, sont beaucoup plus complexes. Jetez un oeil dans Reflector/ILSpy et vous verrez ce que je veux dire.

Vous pouvez toutefois remplacer ce comportement. Si vous utilisez quelque chose comme ce qui suit comme votre grille pour le rectangle bleu, il ne sera plus coupé:

public class MyGrid : Grid { 
    protected override Geometry GetLayoutClip(Size layoutSlotSize) { 
     return null; 
    } 
} 

Il y a un grand billet de blog sur ce here.

+0

Fantastique. Je vous remercie! Vous me sauvez plus de mal au cœur. C'est en effet une petite méthode agaçante. – chrislarson

Questions connexes