2010-11-26 5 views
2

J'ai une classe qui hérite de Button. Dans le XAML pour la classe, j'ai spécifié une largeur et une hauteur et un contenu, dans l'espoir que lorsque j'utilise le concepteur VS2010 WPF pour insérer mon contrôle dans e.g. une fenêtre, ce sont les valeurs par défaut de ces propriétés. Cependant, le concepteur utilise les valeurs par défaut de Button.Comment contrôler les propriétés par défaut pour un contrôle personnalisé dans VS2010 Concepteur WPF

Mon contrôle XAML:

<Button x:Class="Something.FunctionButton4" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
     xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
     mc:Ignorable="d" 
     d:DesignHeight="64" d:DesignWidth="64" 
    Height="64" Width="64" Content="FunctionButton" 
    OverridesDefaultStyle="True" 
    Focusable="False"> 
    <Button.Template> 
    <ControlTemplate TargetType="Button"> 
     ... 
    </ControlTemplate> 
    </Button.Template> 
</Button> 

généré par le Concepteur XAML:

<my:FunctionButton4 Content="Button" Height="23" x:Name="functionButton43" Width="75" /> 

Que dois-je faire pour contrôler les paramètres par défaut de concepteur?

+0

double possible de http://stackoverflow.com/questions/75495/wpf-usercontrol-design-time-size –

+0

@Craig, la question vous avez lié à semble être à l'opposé: il s'agit de * pas * en utilisant la largeur et la hauteur du contrôle (à l'exécution), alors que cette question est de * vouloir * les utiliser (au moment du design). –

+0

@ Joe, whoops c'est ainsi. J'ai mal lu ça. Les mêmes principes devraient s'appliquer, mais cela pourrait être utile. –

Répondre

0

Enlever Height="64" Width="64". Le DesignHeight et DesignWidth serait suffisant.

Editer: Dans votre constructeur de contrôles. Initialiser les valeurs par défaut souhaitées, en vérifiant si le contrôle est en mode conception.

public FunctionButton4() 
{ 
    if(DesignerProperties.GetIsInDesignMode) 
    { 
     this.MinHeight = 30d; /// Min Height or Height whichever is your concern 
     this.MinWidth = 75d; 
    } 
} 
+0

Non, ils ne font rien non plus. Ils ont seulement un effet sur la façon dont le contrôle apparaît lui-même dans le concepteur. – NPVN

+0

Pourriez-vous élaborer davantage? –

+0

Le problème se produit lorsque je souhaite utiliser mon contrôle, par exemple. une fenêtre: Dans le concepteur, j'ouvre la boîte à outils, sélectionnez mon contrôle, puis cliquez dans la fenêtre. Le contrôle qui est inséré a Largeur = 75 au lieu de Largeur = 64, et de même Hauteur et Contenu ne sont pas ce que je veux par défaut. Les valeurs par défaut utilisées (par exemple Width = 75) sont les valeurs par défaut pour Button, dont mon contrôle est dérivé. – NPVN

0

Je ne l'ai pas utilisé auparavant, mais je crois que c'est ce que DependencyProperty.OverrideMetadata est pour.

Dans votre classe, vous ajouteriez un constructeur statique, et dans ce constructeur statique, vous appelleriez OverrideMetadata, en passant un PropertyMetadata avec votre nouvelle valeur par défaut. Par exemple: (théorique, non testé)

static FunctionButton4() { 
    WidthProperty.OverrideMetadata(
     typeof(FunctionButton4), new PropertyMetadata(64)); 
    HeightProperty.OverrideMetadata(
     typeof(FunctionButton4), new PropertyMetadata(64)); 
} 
1

C'est ce que DependencyProperty.OverrideMetadata est pour.

Dans le constructeur statique, vous appelez OverrideMetadata, en transmettant un FrameworkPropertyMetadata avec votre nouvelle valeur par défaut. Par exemple, cela définit la largeur par défaut d'un bouton à 60

public class NewButton : Button 
{ 
    static NewButton() 
    { 
     WidthProperty.OverrideMetadata(typeof(NewButton), new FrameworkPropertyMetadata((double)60)); 
    } 
} 
Questions connexes