2015-03-17 2 views
0

J'ai un ItemTemplate pour un ItemsControl dont le contenu est clipsé une fois que je précise une MinWidth qui se traduit par une plus grande largeur que l'ensemble Width dans le récipient, mais sinon pas d'écrêtage.Clipping se produit lorsque MinWidth est réglé

L'image suivante montre le bouton dont MinWidth est réglé sur 100, tandis que l'est lié à quelque chose de plus petit, comme on peut le voir par « Test » être coupé Width de conteneur au large.

Clipping of a button

<timeline:TimeControl.ItemTemplate> 
    <DataTemplate DataType="activityVm:WorkIntervalViewModel"> 
     <Button 
      MinWidth="100" 
      Content="Test" /> 
    </DataTemplate> 
</timeline:TimeControl.ItemTemplate> 

Mon conteneur article dérive de ContentControl et a le modèle suivant appliqué:

<Style TargetType="{x:Type controls:TimeControlItem}"> 
    <Setter Property="Template"> 
     <Setter.Value> 
      <ControlTemplate TargetType="{x:Type controls:TimeControlItem}"> 
       <ContentPresenter /> 
      </ControlTemplate> 
     </Setter.Value> 
    </Setter> 
</Style> 

Quelles sont les causes de ce comportement, et comment puis-je garantir que le contenu ne sont jamais coupés, mais la largeur minimum demandée est-elle plutôt obtenue?

+0

Il est difficile de juger à partir de cet exemple de code limité, mais je suppose qu'il a quelque chose à voir avec le conteneur parent plutôt que le 'DataTemplate'. Pouvez-vous montrer une capture d'écran de la coupure? – Sheridan

+0

@Sheridan J'ai ajouté une image. Il convient également de noter que le découpage se produit lorsque le conteneur a un ensemble 'Width' qui est plus petit que le' MinWidth' du 'ItemTemplate'. –

+0

En outre, la définition de 'MinWidth' sur le conteneur fonctionne, mais j'ai besoin de calculer le' MinWidth' dans le 'ItemTemplate' et non dans le conteneur, donc je ne vois pas immédiatement comment c'est une solution. –

Répondre

0

Je crois que votre problème est dû au fait que votre TextBlock donne au texte (Content) votre largeur minimale, mais il n'est pas visible car il est centré et votre contrôle parent ne lui donne pas la largeur désirée. Essayez ceci:

<DataTemplate DataType="activityVm:WorkIntervalViewModel"> 
    <Button MinWidth="100" HorizontalContentAlignment="Left" Content="Test" /> 
</DataTemplate> 
+0

Non, il en va de même pour, par exemple, ''. Les bonnes frontières arrondies sont coupées. –

+0

Vous avez déjà dit que le contrôle parent ne donne pas assez d'espace à TextBlock ... que peut-on faire à ce sujet? Donnez plus de place au 'TextBlock' depuis le parent. – Sheridan

+0

'TextBlock' n'est pas pertinent, mais le problème semble en effet que le contenu dans le modèle d'élément est plus grand que le conteneur d'éléments. Le comportement bizarre est que, une fois que cela se produit, le modèle d'élément est coupé. S'il y a assez d'espace, il n'est pas coupé. Ceci est quelque chose qui n'est pas démontré par cet exemple de code, mais quand, par exemple,appliquer des marges négatives, et ainsi positionner le contenu dans le modèle d'élément en dehors de sa région limitante. Cela fonctionne, tant que le conteneur offre suffisamment d'espace. S'il n'y a pas d'écrêtage dans la région limite. –

0

Clipping semblait se produire lorsque la taille du contenu dans ItemTemplate a dépassé la taille du récipient, donc aussi tout simplement lors de la mise Width au lieu de MinWidth.

Bien que je ne pas bien comprendre la mécanique derrière tout cela, il me semblait rappeler la phase de mesure de Canvas œuvres quelque peu différentes, donc j'ai décidé d'envelopper le contrôle spécifié dans ItemTemplate (Button au sein de l'exemple précédent) avec un Canvas.

<timeline:TimeControl.ItemTemplate> 
    <DataTemplate DataType="activityVm:WorkIntervalViewModel"> 
     <Canvas> 
      <Button 
       MinWidth="100" 
       Content="Test" /> 
     </Canvas> 
    </DataTemplate> 
</timeline:TimeControl.ItemTemplate> 

Le bouton est maintenant affiché avec une largeur de 100 pixels, même si cette taille est supérieure à la taille du conteneur d'éléments.

Si quelqu'un a la moindre idée de la différence exacte ici, je suis toujours très intéressé à comprendre ce qui se passe ici.