50 votos

WPF UserControl diseño tiempo tamaño

Al crear un control de usuario en WPF, me parece conveniente para darle algo de arbitrario valores de Altura y Anchura para que yo pueda ver mis cambios en el diseñador de Visual Studio. Cuando ejecuto el control, sin embargo, quiero la Altura y la Anchura a ser indefinido, por lo que el control se expande para llenar cualquier contenedor que se lo ponga. ¿Cómo puedo obtener esta misma funcionalidad sin tener que quitar la Altura y la Anchura de los valores antes de la construcción de mi control? (O sin el uso de DockPanel en el contenedor primario.)

El código siguiente muestra el problema:

<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 siguiente definición de UserControl1 muestra razonablemente en tiempo de diseño, pero se muestra como un tamaño fijo en tiempo de ejecución:

<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 siguiente definición de UserControl1 muestra como un punto en tiempo de diseño, sino que se expande para llenar el padre Window1 en tiempo de ejecución:

<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 Puntos 7840

Para mezcla, un truco poco conocido es añadir estos atributos al usercontrol o ventana:

 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"

Esto ajustará el diseño alto y ancho a 500 y 600 respectivamente. Sin embargo esto sólo funcionará para el diseñador de mezcla. No el diseñador de Visual Studio.

En cuanto al diseñador de Visual Studio tu técnica es lo que funciona. Eso es por que no uso el diseñador de Visual Studio. ;)

38voto

AlexDuggleby Puntos 4322

En Visual Studio agregar la Anchura y la Altura de atributo a su UserControl XAML, pero en el código-detrás de la inserción de este

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

Esto se comprueba para ver si el control se ejecuta en el Diseño de modo. Si no (es decir, en tiempo de ejecución) se va a establecer la Anchura y la Altura a NaN (No un número) que es el valor que se establezca si se quita los atributos de Anchura y Altura en XAML.

Así que en tiempo de diseño, usted tendrá el ajuste preestablecido de la anchura y la altura (incluso si pones el control de usuario en un formulario) y en tiempo de ejecución que se base en función de su contenedor primario.

Espero que ayude.

8voto

CLaRGe Puntos 1055

Aquí está una lista de Atributos en tiempo de diseño en el diseñador de Silverlight. Son las mismas para el diseñador WPF.

Enumera todos los d: los valores disponibles en el diseñador tales como d:DesignHeight , d:DesignWidth , d:IsDesignTimeCreatable , d:CreateList y varios otros.

6voto

AndyL Puntos 1046

Esto lo hago todo el tiempo. Simplemente establezca los valores width y height en "auto" donde crea una instancia de su control, y esto anulará los valores de tiempo de diseño para ese UserControl.

es decir:<loc:UserControl1 Width="auto" Height="auto" />

Otra opción es establecer una combinación de MinWidth y MinHeight a un tamaño que permite el trabajo de tiempo de diseño, permaneciendo Width y Height "auto". Obviamente, esto sólo funciona si no tienes el UserControl de tamaño menor que los valores min en tiempo de ejecución.

2voto

Ondrej Puntos 158

Yo estaba buscando la solución similar como el que se utiliza en la Mezcla y con sus menciona que he creado sencillo el comportamiento de la clase con dos propiedades adjuntas el Ancho Y la Altura a la que se aplica sólo en DesinTime

public static de la clase DesignBehavior 
{
 private static readonly Tipo OwnerType = typeof (DesignBehavior);

 #Ancho de la región

 public static readonly DependencyProperty WidthProperty =
DependencyProperty.RegisterAttached(
"Anchura",
 typeof (doble),
OwnerType,
 nueva FrameworkPropertyMetadata(el doble.NaN, nueva PropertyChangedCallback(WidthChangedCallback)));

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

 public static void SetWidth(DependencyObject depObj, el doble de valor)
{
 depObj.SetValue(WidthProperty, valor);
}

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

#endregion

 #Altura para la región

 public static readonly DependencyProperty HeightProperty =
DependencyProperty.RegisterAttached(
"La altura",
 typeof (doble),
OwnerType,
 nueva FrameworkPropertyMetadata(el doble.NaN, nueva PropertyChangedCallback(HeightChangedCallback)));

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

 public static void SetHeight(DependencyObject depObj, el doble de valor)
{
 depObj.SetValue(HeightProperty, valor);
}


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

#endregion

}

A continuación, en el UserControl que acaba de establecer estas propiedades en Xaml

<UserControl x:Class="ExtendedDataGrid.Views.PersonOverviewView"
xmlns="http://schemas.de microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.de microsoft.com/winfx/2006/xaml"
xmlns:herramienta="http://schemas.de microsoft.com/wpf/2008/toolkit"
xmlns:b="clr-namespace:ExtendedDataGrid.Comportamientos"
 b:DesignBehavior.Width="600" b:DesignBehavior.Height="200">
<Grid>
...
</Grid>
</UserControl>

Iteramos.com

Iteramos es una comunidad de desarrolladores que busca expandir el conocimiento de la programación mas allá del inglés.
Tenemos una gran cantidad de contenido, y también puedes hacer tus propias preguntas o resolver las de los demás.

Powered by:

X