web-dev-qa-db-fra.com

comment redimensionner les contrôles en wpf, équivalent des propriétés d'ancrage / d'ancrage

J'ai lu tellement de solutions à ce problème. chacun d'eux ne parvient pas à résoudre mon problème. quel que soit le conteneur dans lequel je mets le contrôle ou les propriétés que j'ai définies sur le contrôle/conteneur, il ne bougera pas. J'ai un visualiseur de défilement avec un contrôle à l'intérieur. Je veux qu'il redimensionne avec la fenêtre lorsque l'utilisateur le redimensionne au moment de l'exécution. tout ce dont j'ai besoin est ancre = haut, bas, gauche, droite. Je ne comprends pas pourquoi cela est si insaisissable dans WPF et pourquoi les objets conteneurs et toutes sortes d'affectations de propriété doivent être impliqués pour accomplir ce qu'une seule propriété peut dans Forms. mais chaque solution à ce problème a pour résultat que mon contrôle reste exactement à sa taille au moment de la conception lorsque la fenêtre est redimensionnée au moment de l'exécution. quel est le moyen le plus simple de maîtriser le dimensionnement des commandes dynamiques dans wpf?

29
Mike

Cela m'a aussi causé du chagrin et AlexK m'a aidé à voir la lumière. L'astuce n'est PAS de définir la hauteur et la largeur .... Réglez-les sur AUTO et utilisez MARGIN pour définir la taille. Définissez HORIZONTALALIGNMENT et VERTICALALIGNMENT sur STRETCH, puis la fonctionnalité d'ancrage fonctionne.

46
www.redware.com

Le contrôle doit s'étirer, c'est tout ce qu'il devrait y avoir:

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

Stretch remplace la définition des achors des deux côtés respectifs.

Pour obtenir de l'aide sur les panneaux, voir cet aperç . Voir aussi documentation du système de mise en page .

La plupart des contrôles s'étirent automatiquement, si vous avez un DataGrid, il devrait aussi s'étirer, essayez cet exemple dans Kaxaml , il contient un DataGrid et un TextBlock qui montre sa taille:

<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 vous redimensionnez la fenêtre, les barres de défilement de DataGrid devraient apparaître.

5
H.B.

Je suppose que le contrôle qui ne redimensionne pas est votre contrôle personnalisé.

  • Utilisez DockPanel comme conteneur.
  • Supprimez les propriétés de largeur et de hauteur explicites de votre contrôle.

Si vous travaillez dans VS2008, cela entraîne des inconvénients, car vous contrôlez réduirait à la taille minimale lors de l'affichage dans le concepteur.

Expressions Blend et à partir de VS2010 respectent tous deux l'espace de noms du concepteur, vous pouvez donc spécifier la taille de contrôle uniquement au moment de la conception.

Pour cela, ajoutez ce qui suit à votre contrôle:

<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 et d: DesignHeight spécifient la largeur et la hauteur du temps de conception.

4
AlexK

Cette question est ancienne mais, depuis que j'ai trouvé mon ici, j'ai pensé jeter ma solution. Le code ci-dessous est pour un contrôle onglet avec deux onglets et chaque onglet contient un contrôle pour remplir l'onglet. J'ai supprimé la largeur et la hauteur explicitement définies et défini les alignements horizontal et vertical sur auto sur tous les contrôles que je voulais redimensionner. Le contrôle onglet s'étend avec la fenêtre principale. Les contrôles dans les onglets s'étirent pour remplir les onglets. Les informations proviennent des réponses ici. Je viens de mettre un exemple complet.

J'espère que cela sera utile à quelqu'un.

        <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>
1
Tony Heflin

J'ai également rencontré ce problème. et Tentative de liaison aux propriétés parent des propriétés ActualHeight et ActualWidth, sauf que cela ne fonctionne que si vous le faites via du code derrière et non par XAML.

c'est-à-dire XAML

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

dans le .cs code derrière

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