web-dev-qa-db-fra.com

Comment étendre en largeur un contrôle utilisateur WPF à sa fenêtre?

J'ai une fenêtre avec mon contrôle utilisateur et je voudrais que la largeur du contrôle utilisateur soit égale à la largeur de la fenêtre. Comment faire ça?

Le contrôle utilisateur est un menu horizontal et contient une grille à trois colonnes:

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

C'est la raison pour laquelle je veux que la largeur de la fenêtre étire le contrôle utilisateur à 100% de largeur, avec la deuxième colonne relative.

MODIFIER:

J'utilise une grille, il y a le code pour Window:

<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>
42
Victor Rodrigues

Vous devez vous assurer que votre usercontrol n'a pas défini sa largeur dans le fichier xaml de l'usercontrol. Il suffit de supprimer la largeur = "..." de celui-ci et vous êtes prêt à partir!

EDIT: Voici le code avec lequel je l'ai testé:

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>
43
Arjan Einbu

Le canevas dans WPF ne fournit pas beaucoup de prise en charge automatique de la mise en page. J'essaie de les éviter pour cette raison (HorizontalAlignment et VerticalAlignment ne fonctionnent pas comme prévu), mais j'ai obtenu que votre code fonctionne avec ces modifications mineures (en liant la largeur et la hauteur du contrôle à la largeur réelle/largeur réelle du canevas).

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

La toile est le problème ici. Si vous n'utilisez pas réellement les fonctionnalités du canevas en termes de mise en page ou de "squashing" Z-Order (pensez à la commande d'aplatissement dans PhotoShop), j'envisagerais plutôt d'utiliser un contrôle comme une grille pour ne pas finir avoir à apprendre les bizarreries d'un contrôle qui fonctionne différemment de ce que vous attendez avec WPF.

21
Michael

La toile est-elle cruciale dans votre fenêtre? Sinon, essayez de le retirer et de conserver la grille comme panneau principal. La toile n'a pas de taille sauf indication contraire, tandis qu'une grille occupe normalement tout l'espace disponible. À l'intérieur du canevas, la grille n'aura aucun espace disponible.

7
Bubblewrap

La définition de HorizontalAlignment sur Stretch et de Width sur Auto sur le contrôle utilisateur permet-elle d'obtenir les résultats souhaités?

2
Jason Miesionczek

Utilisez plutôt la largeur et la hauteur dans les contrôles utilisateur, utilisez MinHeight et MinWidth. Ensuite, vous pouvez bien configurer l'UC et vous pourrez vous étirer à l'intérieur d'une autre fenêtre.

Eh bien, comme je le vois dans WPF, Microsoft a repensé les propriétés et les comportements de Windows, mais jusqu'à présent, je n'ai rien oublié des anciennes formes de fenêtres, dans WPF les contrôles sont là, mais dans un nouveau point de vue.

1
Leonardo Nowaczyk

Cela a fonctionné pour moi. n'attribuez aucune largeur ou hauteur à UserControl et définissez la définition de ligne et de colonne dans la fenêtre parent.

<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>
1
Shahid

À quel conteneur ajoutez-vous UserControl? Généralement, lorsque vous ajoutez des contrôles à une grille, ils s'étirent pour remplir l'espace disponible (sauf si leur ligne/colonne est limitée à une certaine largeur).

1
Andy