2011-05-10 7 views
25

He leído muchas soluciones a este problema. cada uno de ellos no puede resolver mi problema. no importa en qué contenedor ponga el control o qué propiedades establezca en el control/contenedor, no se moverá. Tengo un visor de desplazamiento con control dentro. Quiero que cambie el tamaño de la ventana cuando el usuario la cambie de tamaño en el tiempo de ejecución. todo lo que necesito es ancla = arriba, abajo, izquierda, derecha. No entiendo por qué esto es tan elusivo en WPF y por qué los objetos de contenedor y todo tipo de asignaciones de propiedades deben involucrarse para lograr lo que una sola propiedad puede tener en los formularios. pero cada solución a este problema todavía resulta en que mi control permanezca exactamente en el tamaño de su tiempo de diseño a medida que la ventana cambia de tamaño en el tiempo de ejecución. ¿Cuál es la forma más sencilla de controlar el tamaño del control dinámico en wpf?cómo hacer que los controles cambien de tamaño en wpf, equivelant de las propiedades de anclas/bases

+2

Podría mostrarnos el código XAML que tienes ahora? – svick

+0

Puedes probar width/height = "*" y/o usar stackpanel – deathrace

Respuesta

5

El control tiene que estirar, eso es todo lo que debería ser la de que:

<MyControl HorizontalAlignment="Stretch" VerticalAlignment="Stretch"/> 

Stretch reemplaza la configuración achors a ambos lados respectivos.

Para obtener ayuda sobre paneles, consulte this overview. También vea el documentation of the layout system.

mayoría de los controles estirar de forma automática, si usted tiene una cuadrícula de datos se debe estirar demasiado, trate de esta muestra en Kaxaml, que contiene una cuadrícula de datos y un TextBlock que muestra su tamaño:

<Window xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"> 
    <Grid> 
     <Grid.RowDefinitions> 
      <RowDefinition /> 
      <RowDefinition Height="Auto"/> 
     </Grid.RowDefinitions> 
     <DataGrid Name="grid"> 
      <DataGrid.Columns> 
       <DataGridTextColumn Binding="{Binding Name}" Header="Name"/> 
       <DataGridTextColumn Binding="{Binding Tag}" Header="Occupation"/> 
      </DataGrid.Columns> 
      <FrameworkElement Name="Skeet" Tag="Programmer"/> 
      <FrameworkElement Name="Gravell" Tag="Programmer"/> 
      <FrameworkElement Name="Steve" Tag="Coffee Getter"/> 
     </DataGrid> 
     <TextBlock Grid.Row="1"> 
      <TextBlock.Text> 
       <MultiBinding StringFormat="{}{0}, {1}"> 
        <Binding ElementName="grid" Path="ActualWidth"/> 
        <Binding ElementName="grid" Path="ActualHeight"/> 
       </MultiBinding> 
      </TextBlock.Text> 
     </TextBlock> 
    </Grid> 
</Window> 

Si ajusta el tamaño de la ventana hacia abajo las ScrollBars de DataGrid deberían aparecer.

+0

He intentado todas las combinaciones de ajustes de alineación. cada vez que el control se mantiene estrictamente en sus dimensiones de tiempo de diseño. debe haber algo más que le impide cambiar el tamaño, simplemente no puedo ver qué. – Mike

+0

El panel en el que se encuentra el control tiene que ofrecer límites, de lo contrario no podrá estirar, un scrollviewer no lo hace, ya que su propósito es permitir la visualización de controles de cualquier tamaño, normalmente no restringen sus contenidos. Editar: en realidad funciona con un ScrollViewer y, en algunos casos, depende del control. ¿Cuál es el control que estás usando de todos modos? –

+0

Es una cuadrícula de datos. Estoy tratando de hacerlo para que el scrollviewer cambie el tamaño del tamaño de la ventana (o el tamaño disponible de la ventana, también hay otros controles, pero este es el que necesita aumentar) pero si la cuadrícula de datos todavía es demasiado grande. Quiero que el scrollviewer proporcione un medio para llegar al contenido fuera de límites. – Mike

4

Supongo que el control que no cambia de tamaño es su control personalizado.

  • Utilice DockPanel como contenedor.
  • Elimina las propiedades explícitas Ancho y Altura de tu control.

Si trabaja en VS2008, esto ocasiona inconvenientes, ya que el control se colapsaría al tamaño mínimo cuando se lo visualice en el diseñador.

Expresiones Las mezclas y a partir de VS2010 respetan el espacio de nombres del diseñador, por lo que puede especificar el tiempo de diseño solo para el tamaño de control.

Para que añadir lo siguiente al de su control:

<UserControl ... 
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
    mc:Ignorable="d" 
    d:DesignWidth="WWW" d:DesignHeight="HHH"> 
    .... 
</UserControl> 

d: DesignWidth y D: DesignHeight especificar el ancho tiempo de diseño y altura.

+0

He intentado ponerlo en un panel de base. me parece que el control se expandirá para llenar el panel del dock, pero el dockpanel en sí permanece del mismo tamaño independientemente de cuán grande sea la ventana. – Mike

+0

Bajé esta votación por accidente. Ni siquiera me di cuenta de que lo había hecho en ese momento. Me gustaría deshacerlo, pero no me permitirá cambiar mi voto a menos que se edite la respuesta. – TomDestry

1

Esta pregunta es antigua pero, desde que encontré mi aquí, pensé que descartaría mi solución. El siguiente código es para un control de pestañas con dos pestañas y cada pestaña contiene un control para llenar la pestaña. Eliminé el ancho y el alto explícitamente establecidos, y establecí las alineaciones horizontales y verticales en automático en todos los controles que quería cambiar el tamaño. El control de pestañas se extiende con la ventana principal. Los controles en las pestañas se estiran para llenar las pestañas. La información vino de las respuestas aquí. Acabo de poner un ejemplo completo.

Espero que esto sea útil para alguien.

 <TabControl HorizontalAlignment="Stretch" 
       Margin="91,0,0,0" Name="tabControl1" 
       VerticalAlignment="Stretch" > 
     <TabItem Header="DataGrid" Name="tabItem1"> 
      <Grid> 
       <DataGrid AutoGenerateColumns="False" 
          HorizontalAlignment="Stretch" 
          Name="dgFTPLog" 
          VerticalAlignment="Stretch" 
          Margin="6,6,0,0" /> 
      </Grid> 
     </TabItem> 
     <TabItem Header="Log" Name="tabItem2"> 
      <Grid> 
       <TextBox 
         HorizontalAlignment="Stretch" 
         Margin="6,6,0,0" Name="txtLog" 
         VerticalAlignment="Stretch" 
         VerticalScrollBarVisibility="Auto" 
         HorizontalScrollBarVisibility="Auto" 
         TextChanged="txtLog_TextChanged" /> 
      </Grid> 
     </TabItem> 
    </TabControl> 
43

Esto me ha causado dolor también y AlexK me ayudó a ver la luz. El truco es NO establecer la altura y el ancho ....Configúrelos en AUTO y use MARGIN para establecer el tamaño. Establezca HORIZONTALALIGNMENT y VERTICALALIGNMENT en STRETCH y luego la funcionalidad de anclaje funciona.

+0

Esto también funciona. Me salvaste el día. gracias: D –

0

Me he encontrado con este problema también. e intento de vincular a los controles principales las propiedades de ActualHeight y ActualWidth, excepto que esto solo funciona si lo haces a través del código que está detrás no de XAML.

es decir XAML

<MyParentControl x:name="parentControl" SizeChanged="parentControl_SizeChanged"> <ChildControl x:name=childControl" /> </MyParentControl>

en el código beind

private void parentControl_SizeChanged(object sender, SizeChangedEventArgs e) 
    { 
     childControl.Height = parentControl.ActualHeight; 
     childControl.Width = parentControl.ActualWidth; 
    } 
Cuestiones relacionadas