2016-09-09 1 views
0

Je dois créer un contrôle personnalisé similaire à WPF GroupBox. J'ai commencé à partir du modèle standard WPF bibliothèque contrôle personnalisé dans VS 2015 et défini mon contrôle CustomGroupBox comme ceci:ContentControl n'affiche pas le contenu dans ControlTemplate

public class CustomGroupBox : ContentControl 
{ 
    static CustomGroupBox() 
    { 
     DefaultStyleKeyProperty.OverrideMetadata(typeof(CustomGroupBox), new FrameworkPropertyMetadata(typeof(CustomGroupBox))); 
    } 
} 

ensuite ajouté l'ensemble minimal de lignes suivants pour développer mon GroupBox personnalisé selon les spécifications:

<ResourceDictionary 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:local="clr-namespace:CustomGroupBox"> 
    <Style TargetType="{x:Type local:CustomGroupBox}"> 
     <Setter Property="Template"> 
      <Setter.Value> 
       <ControlTemplate TargetType="{x:Type local:CustomGroupBox}"> 
        <Border Background="{TemplateBinding Background}" 
          BorderBrush="Gray" BorderThickness="3" CornerRadius="3"> 
         <ContentControl /> 
        </Border> 
       </ControlTemplate> 
      </Setter.Value> 
     </Setter> 
    </Style> 
</ResourceDictionary> 

pour debug et développer, j'ai créé une forme de test pour mon contrôle personnalisé:

<Window x:Class="CustomGroupBoxClient.MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
     xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
     xmlns:local="clr-namespace:CustomGroupBoxClient" 
     xmlns:ctrl="clr-namespace:CustomGroupBox;assembly=CustomGroupBox" 
     mc:Ignorable="d" 
     Title="MainWindow" Height="350" Width="525"> 
    <Grid> 
     <ctrl:CustomGroupBox Margin="5"> 
      <StackPanel Orientation="Vertical"> 
       <TextBlock>Text Block #1</TextBlock> 
       <TextBlock>Text Block #2</TextBlock> 
      </StackPanel> 
     </ctrl:CustomGroupBox> 
    </Grid> 
</Window> 

Cependant, quand je lance ce formulaire, je vois la frontière de mon contrôle personnalisé, mais pas le contenu (2 TextBlock de):

enter image description here

J'ai relu beaucoup de manuels et d'articles liés à cette rubrique, mais ne peut toujours pas comprendre pourquoi ContentControl dans mon ControlTemplate n'affiche pas le contenu spécifié. Comment résoudre mon problème?

+2

Essayez d'utiliser 'ContentPresenter' à la place de' ContentControl', ou vous liez explicitement: ''. Cela suppose que la propriété content de votre contrôle personnalisé s'appelle 'Content', mais si vous héritez de' ContentControl', ce n'est pas une supposition sauvage. –

Répondre

1

Essayez d'utiliser ContentPresenter au lieu de ContentControl dans votre modèle:

<ContentPresenter /> 

Par défaut, ContentPresenter trouve la propriété Content de son parent et affiche tout basé sur un modèle qu'il y trouve. Vous pouvez changer le nom de la propriété il recherche en changeant sa valeur ContentSource ...

<ContentPresenter ContentSource="FooBar" /> 

... mais puisque vous êtes héritant de ContentControl, la valeur par défaut est probablement ce que vous voulez.

+1

Merde, c'était une question idiote. Tous les modèles de contrôles WPF standard utilisent ContentPresenter. Peut-être, j'ai été essayé alors j'ai oublié ça ... – TecMan