it-swarm.com.de

Wie man die Größe von Steuerelementen in wpf ändert, entspricht den Anker- / Dock-Eigenschaften

Ich habe so viele Lösungen dieses Problems gelesen. Jeder von ihnen kann mein Problem nicht lösen. Ganz gleich, in welchen Container ich das Steuerelement stecke oder welche Eigenschaften ich für das Steuerelement/den Container festgelegt habe, es wird sich nicht bewegen. Ich habe einen Scroll-Viewer mit einem Steuerelement. Ich möchte, dass die Größe des Fensters geändert wird, wenn der Benutzer die Größe zur Laufzeit ändert. Alles was ich brauche ist Anker = oben, unten, links, rechts. Ich verstehe nicht, warum dies in WPF so schwer fassbar ist und warum Containerobjekte und alle Arten von Eigenschaftszuweisungen einbezogen werden müssen, um das zu erreichen, was eine einzelne Eigenschaft in Forms kann. Aber jede Lösung für dieses Problem führt immer noch dazu, dass mein Steuerelement genau seine Entwurfszeitgröße beibehält, da die Größe des Fensters zur Laufzeit geändert wird. Was ist der einfache Weg, um die Größe von dynamischen Steuerelementen in wpf in den Griff zu bekommen?

29
Mike

Das hat mich auch betrübt und AlexK hat mir geholfen, das Licht zu sehen. Der Trick besteht NICHT darin, die Höhe und Breite einzustellen. Stellen Sie diese auf AUTO und verwenden Sie MARGIN, um die Größe einzustellen. Setzen Sie HORIZONTALALIGNMENT und VERTICALALIGNMENT auf STRETCH, und die Ankerfunktion funktioniert.

46
www.redware.com

Die Steuerung muss sich dehnen, das ist alles, was dazu gehören sollte:

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

Stretch ersetzt das Setzen von Ankern auf beiden Seiten.

Hilfe zu Panels finden Sie unter diese Übersicht . Siehe auch Dokumentation des Layoutsystems .

Die meisten Steuerelemente werden automatisch gedehnt. Wenn Sie ein DataGrid haben, das ebenfalls gedehnt werden soll, probieren Sie dieses Beispiel in Kaxaml aus. Es enthält ein DataGrid und einen TextBlock, der seine Größe anzeigt:

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

Wenn Sie das Fenster verkleinern, sollten die ScrollBars des DataGrid angezeigt werden.

5
H.B.

Ich gehe davon aus, dass das Steuerelement, dessen Größe nicht geändert wird, Ihr benutzerdefiniertes Steuerelement ist.

  • Verwenden Sie DockPanel als Container.
  • Entfernen Sie explizite Width- und Height-Eigenschaften aus Ihrem Steuerelement.

Wenn Sie in VS2008 arbeiten, führt dies zu Unannehmlichkeiten, da das Steuerelement bei der Anzeige im Designer auf die minimale Größe reduziert wird.

Expressions Blend und ab VS2010 berücksichtigen beide den Designer-Namespace, sodass Sie nur die Steuerelementgröße für die Entwurfszeit angeben können.

Fügen Sie dazu Ihrer Kontrolle Folgendes hinzu:

<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 und d: DesignHeight geben die Breite und Höhe der Entwurfszeit an.

4
AlexK

Diese Frage ist alt, aber seit ich meine hier gefunden habe, dachte ich, ich würde meine Lösung rausschmeißen. Der folgende Code bezieht sich auf ein Registersteuerelement mit zwei Registerkarten, und jede Registerkarte enthält ein Steuerelement zum Ausfüllen der Registerkarte. Ich habe die explizit festgelegte Breite und Höhe entfernt und die horizontale und vertikale Ausrichtung für alle Steuerelemente, deren Größe ich ändern wollte, auf Automatisch eingestellt. Die Registerkarte erstreckt sich über das Hauptfenster. Die Steuerelemente in den Registerkarten werden gestreckt, um die Registerkarten auszufüllen. Die Informationen stammen aus den Antworten hier. Ich habe nur ein vollständiges Beispiel angeführt.

Hoffe, das ist nützlich für jemanden.

        <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

Ich bin auch auf diese Probleme gestoßen. und Es wurde versucht, die Eigenschaften ActualHeight und ActualWidth an übergeordnete Steuerelemente zu binden. Dies funktioniert jedoch nur, wenn Sie dies über den Code tun, der sich dahinter befindet, nicht über XAML.

das heißt XAML

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

in dem .cs Code dahinter

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