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?
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.
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.
Je suppose que le contrôle qui ne redimensionne pas est votre contrôle personnalisé.
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.
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>
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;
}