2009-01-20 29 views
38

Tengo una ventana con mi control de usuario y me gustaría hacer que el ancho de control del usuario sea igual al ancho de la ventana. ¿Como hacer eso?¿Cómo estirar en ancho un control de usuario WPF a su ventana?

El control de usuario es un menú horizontal y contiene una cuadrícula con tres columnas:

<ColumnDefinition Name="LeftSideMenu" Width="433"/> 
<ColumnDefinition Name="Middle" Width="*"/> 
<ColumnDefinition Name="RightSideMenu" Width="90"/> 

Esa es la razón por la que quiero que el ancho de la ventana, para estirar el control de usuario a 100% de ancho, con la segunda columna relativo.

EDIT:

estoy usando una cuadrícula, no es el código de la ventana:

<Window x:Class="TCI.Indexer.UI.Operacao" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:tci="clr-namespace:TCI.Indexer.UI.Controles" 
    Title=" " MinHeight="550" MinWidth="675" Loaded="Load" ResizeMode="NoResize" WindowStyle="None" WindowStartupLocation="CenterScreen" WindowState="Maximized" Focusable="True" 
    x:Name="windowOperacao"> 
    <Canvas x:Name="canv"> 
     <Grid> 
      <tci:Status x:Name="ucStatus"/> <!-- the control which I want to stretch in width --> 
     </Grid> 
    </Canvas> 
</Window> 

Respuesta

38

Debe asegurarse de que su usercontrol no haya configurado su ancho en el archivo xaml de usercontrol. Simplemente elimine el ancho = "..." y ¡ya está listo!

EDIT: El código lo probé con:

SOUserAnswerTest.xaml:

<UserControl x:Class="WpfApplication1.SOAnswerTest" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    Height="300"> 
    <Grid> 
     <Grid.ColumnDefinitions> 
      <ColumnDefinition Name="LeftSideMenu" Width="100"/> 
      <ColumnDefinition Name="Middle" Width="*"/> 
      <ColumnDefinition Name="RightSideMenu" Width="90"/> 
     </Grid.ColumnDefinitions> 
     <TextBlock Grid.Column="0">a</TextBlock> 
     <TextBlock Grid.Column="1">b</TextBlock> 
     <TextBlock Grid.Column="2">c</TextBlock> 
    </Grid> 
</UserControl> 

Window1.xaml:

<Window x:Class="WpfApplication1.Window1" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:local="clr-namespace:WpfApplication1" 
    Title="Window1" Height="300" Width="415"> 
    <Grid> 

     <local:SOAnswerTest Grid.Column="0" Grid.Row="5" Grid.ColumnSpan="2"/> 
    </Grid> 
</Window> 
+0

Gracias por la atención, Arjan. Funciona bien aquí también, pero mi ventana no tiene Width = "415" configurado, porque está diseñado para ser pantalla completa. Cuando establezco el ancho, funciona bien. –

1

Lo recipiente se le agrega el control de usuario a? En general, cuando agrega controles a una Grilla, se estirarán para llenar el espacio disponible (a menos que su fila/columna esté limitada a un ancho determinado).

2

¿El ajuste de la Alineación Horizontal a Estirar, y el Ancho en Automático en el control del usuario logran los resultados deseados?

7

es el lienzo crucial en su ventana? De lo contrario, intente eliminarlo y mantenga la Cuadrícula como panel principal. El lienzo no tiene un tamaño a menos que se especifique, mientras que un Rejilla normalmente ocupa todo el espacio disponible. Dentro del lienzo, la rejilla no tendrá espacio disponible.

20

El lienzo en WPF no proporciona mucho soporte de diseño automático. Intento alejarme de ellos por esta razón (HorizontalAlignment y VerticalAlignment no funcionan como se esperaba), pero obtuve su código para trabajar con estas modificaciones menores (vinculando el ancho y alto del control al realWidth/ActualHeight del lienzo).

<Window x:Class="TCI.Indexer.UI.Operacao" 
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
xmlns:tci="clr-namespace:TCI.Indexer.UI.Controles" 
Title=" " MinHeight="550" MinWidth="675" Loaded="Load" 
ResizeMode="NoResize" WindowStyle="None" WindowStartupLocation="CenterScreen" 
WindowState="Maximized" Focusable="True" x:Name="windowOperacao"> 

<Canvas x:Name="canv"> 
    <Grid> 
     <tci:Status x:Name="ucStatus" Width="{Binding ElementName=canv 
                , Path=ActualWidth}" 
             Height="{Binding ElementName=canv 
                , Path=ActualHeight}"/> 
     <!-- the control which I want to stretch in width --> 
    </Grid> 
</Canvas> 

El lienzo es el problema aquí. Si no está utilizando realmente las características que ofrece el lienzo en términos de diseño o "aplastamiento" de orden Z (piense en el comando aplanar en PhotoShop), consideraría usar un control como una rejilla para que no termine tener que aprender las peculiaridades de un control que funciona de manera diferente a lo que esperabas con WPF.

+0

Gracias, el enlace a ActualWidth me ayudó en un proyecto en el que tenía un UserControl personalizado en un StackPanel. StackPanel usó HorizontalAlignement = Stretch y tomó todo el ancho, pero el control de usuario se mantuvo en 0 de ancho. Vinculando el control de usuario a su stackpanel padre ActualWidth lo resolvió por mí. –

1

En lugar de utilizar ancho y alto en controles de usuario, use MinHeight y MinWidth. Luego puede configurar el UC bien y podrá estirar dentro de otra ventana.

Bueno, como estoy viendo en WPF, Microsoft hizo un replanteamiento de las propiedades y comportamientos de Windows, pero hasta ahora, no me perdí nada de los formularios de Windows antiguos, en WPF los controles están ahí, pero en un nuevo punto de vista.

0

Esto funcionó para mí. no asigne ningún ancho o alto al UserControl y defina la definición de filas y columnas en la ventana primaria.

<UserControl x:Class="MySampleApp.myUC" 
     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" 
     > 
    <Grid> 

    </Grid> 
</UserControl> 


<Window xmlns:MySampleApp="clr-namespace:MySampleApp" x:Class="MySampleApp.MainWindow" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    Title="MainWindow" Height="auto" Width="auto" MinWidth="1000" > 
<Grid> 
    <Grid.RowDefinitions> 
     <RowDefinition Height="Auto" />   
    </Grid.RowDefinitions> 
    <Grid.ColumnDefinitions> 
     <ColumnDefinition Width="*" />    
    </Grid.ColumnDefinitions> 
    <MySampleApp:myUC Grid.Column="0" Grid.Row="0" />  
</Grid> 

Cuestiones relacionadas