50 votes

WPF UserControl Design Time Size

Lors de la création d'un UserControl dans WPF, je trouve ça pratique pour lui donner un certain arbitraire, la Hauteur et la Largeur, de sorte que je peux afficher mes modifications dans le concepteur Visual Studio. Quand je lance la commande, cependant, je veux la Hauteur et la Largeur d'être défini, de sorte que le contrôle doit s'étendre à remplir tout ce conteneur je le place dans. Comment puis-je réaliser cette même fonctionnalité sans avoir à retirer la Hauteur et la Largeur des valeurs avant la création de mon contrôle? (Ou sans l'aide de DockPanel dans le conteneur parent.)

Le code suivant illustre le problème:

<Window x:Class="ExampleApplication3.Window1"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:loc="clr-namespace:ExampleApplication3"
    Title="Example" Height="600" Width="600">
    <Grid Background="LightGray">
        <loc:UserControl1 />
    </Grid>
</Window>

La définition suivante de l' UserControl1 affiche raisonnablement au moment de la conception, mais s'affiche comme une taille fixe au moment de l'exécution:

<UserControl x:Class="ExampleApplication3.UserControl1"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Height="300" Width="300">
    <Grid Background="LightCyan" />
</UserControl>

La définition suivante de l' UserControl1 affiche comme un point au moment de la conception, mais s'agrandit pour remplir le parent Window1 au moment de l'exécution:

<UserControl x:Class="ExampleApplication3.UserControl1"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
    <Grid Background="LightCyan" />
</UserControl>

78voto

Brian Leahy Points 7840

Pour Blend, une astuce peu connue consiste à ajouter ces attributs à votre contrôle utilisateur ou à votre fenêtre:

  xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
      xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
mc:Ignorable="d"
       d:DesignHeight="500" d:DesignWidth="600"
 

Cela définira la hauteur et la largeur de conception sur 500 et 600 respectivement. Cependant, cela ne fonctionnera que pour le concepteur de mélange. Pas le concepteur Visual Studio.

En ce qui concerne le concepteur Visual Studio, votre technique est tout ce qui fonctionne. C'est pourquoi je n'utilise pas Visual Studio Designer. ;)

38voto

AlexDuggleby Points 4322

Dans Visual Studio ajouter la Largeur et la Hauteur de l'attribut de votre UserControl XAML, mais dans le code-behind insérer cette

public UserControl1()
{
    InitializeComponent();
    if (LicenseManager.UsageMode != LicenseUsageMode.Designtime)
    {
        this.Width = double.NaN; ;
        this.Height = double.NaN; ;
    }
}

Cette fonction vérifie si le contrôle est en cours d'exécution en mode création. Si non (runtime), qui va définir la Largeur et la Hauteur de NaN (Pas un nombre) qui est la valeur que vous définissez si vous supprimez les attributs Width et Height dans le code XAML.

Ainsi, au moment de la conception, vous aurez le préréglage de la largeur et de la hauteur (y compris si vous placez le contrôle de l'utilisateur dans un formulaire) et à l'exécution, il accostera en fonction de son conteneur parent.

Espérons que cela aide.

8voto

CLaRGe Points 1055

Voici une liste des attributs de conception dans Silverlight Designer . Ils sont les mêmes pour le concepteur WPF.

Il répertorie toutes les valeurs d: disponibles dans Designer, telles que d:DesignHeight , d:DesignWidth , d:IsDesignTimeCreatable , d:CreateList et plusieurs autres.

6voto

AndyL Points 1046

Je le fais tout le temps. Définissez simplement les valeurs width et height sur "auto" à l'endroit où vous instanciez votre contrôle, ce qui remplacera les valeurs de conception de cet UserControl.

c'est-à-dire: <loc:UserControl1 Width="auto" Height="auto" />

Une autre option consiste à définir une combinaison de MinWidth et MinHeight sur une taille permettant le travail au moment du design, tandis que Width et Height restent "auto". Évidemment, cela ne fonctionne que si vous n'avez pas besoin que UserControl ait une taille inférieure à la valeur minimale au moment de l'exécution.

2voto

Ondrej Points 158

J'étais à la recherche de solution similaire comme celui utilisé dans le Mélange et avec vos mentions j'ai créé comportement simple classe avec deux joints propriétés Width Et Height qui sont appliquées que dans des DesinTime

public static de la classe DesignBehavior 
{
 private static readonly Type OwnerType = typeof (DesignBehavior);

 #région Largeur

 public static readonly DependencyProperty WidthProperty =
DependencyProperty.RegisterAttached(
"Largeur",
 typeof (double),
OwnerType,
 nouveau FrameworkPropertyMetadata(double.NaN, nouvelle PropertyChangedCallback(WidthChangedCallback)));

 public static double GetWidth(DependencyObject depObj)
{
 return (double)depObj.GetValue(WidthProperty);
}

 public static void SetWidth(DependencyObject depObj, double valeur)
{
 depObj.SetValue(WidthProperty, valeur);
}

 private static void WidthChangedCallback(DependencyObject depObj, DependencyPropertyChangedEventArgs e)
{
 si (DesignerProperties.GetIsInDesignMode(depObj)) {
 depObj.SetValue(FrameworkElement.WidthProperty, e.NewValue);
}
}

#endregion

 #Hauteur de région

 public static readonly DependencyProperty HeightProperty =
DependencyProperty.RegisterAttached(
"La hauteur",
 typeof (double),
OwnerType,
 nouveau FrameworkPropertyMetadata(double.NaN, nouvelle PropertyChangedCallback(HeightChangedCallback)));

 public static double GetHeight(DependencyObject depObj)
{
 return (double)depObj.GetValue(HeightProperty);
}

 public static void SetHeight(DependencyObject depObj, double valeur)
{
 depObj.SetValue(HeightProperty, valeur);
}


 private static void HeightChangedCallback(DependencyObject depObj, DependencyPropertyChangedEventArgs e)
{
 si (DesignerProperties.GetIsInDesignMode(depObj)) {
 depObj.SetValue(FrameworkElement.HeightProperty, e.NewValue);
}
}

#endregion

}

Puis dans votre UserControl que vous venez de définir ces propriétés dans le code Xaml

<UserControl x:Class="ExtendedDataGrid.Les vues.PersonOverviewView"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:outil="http://schemas.microsoft.com/wpf/2008/toolkit"
xmlns:b="clr-namespace:ExtendedDataGrid.Les comportements"
 b:DesignBehavior.Largeur="600" b:DesignBehavior.Height="200">
<Grid>
...
</Grid>
</UserControl>

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by: