it-swarm.com.de

Wie kann ich ein WPF-Benutzersteuerelement in die Breite seines Fensters strecken?

Ich habe ein Fenster mit meiner Benutzersteuerung und möchte, dass die Breite der Benutzersteuerung der Fensterbreite entspricht. Wie geht das?

Das Benutzersteuerelement ist ein horizontales Menü und enthält ein Raster mit drei Spalten:

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

Aus diesem Grund möchte ich, dass die Fensterbreite das Benutzersteuerelement auf 100% Breite streckt, wobei die zweite Spalte relativ ist.

BEARBEITEN:

Ich benutze ein Gitter, es gibt den Code für Windows:

<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

Sie müssen sicherstellen, dass Ihr Benutzersteuerelement die Breite nicht in der XAML-Datei des Benutzersteuerelements festgelegt hat. Löschen Sie einfach die Breite = "..." und los geht's!

EDIT: Dies ist der Code, mit dem ich es getestet habe:

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

Der Canvas in WPF bietet nicht viel Unterstützung für automatische Layouts. Ich versuche, sie aus diesem Grund zu meiden (HorizontalAlignment und VerticalAlignment funktionieren nicht wie erwartet), aber ich habe Ihren Code dazu gebracht, mit diesen geringfügigen Änderungen zu arbeiten (die Breite und Höhe des Steuerelements an die ActualWidth/ActualHeight der Zeichenfläche binden).

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

Die Leinwand ist hier das Problem. Wenn Sie die Funktionen, die die Zeichenfläche im Hinblick auf Layout oder Z-Order "Squashing" bietet, nicht tatsächlich nutzen (denken Sie an den Befehl "Abflachen" in PhotoShop), würde ich in Betracht ziehen, stattdessen ein Steuerelement wie ein Raster zu verwenden, damit Sie nicht enden Die Macken eines Steuerelements kennenlernen zu müssen, das anders funktioniert, als Sie es von WPF gewohnt sind.

21
Michael

Ist die Leinwand in Ihrem Fenster entscheidend? Wenn nicht, entfernen Sie es und behalten Sie das Gitter als Hauptfenster bei. Canvas hat keine Größe, sofern nicht anders angegeben, während ein Grid normalerweise den gesamten verfügbaren Speicherplatz belegt. Im Canvas-Bereich ist für das Raster kein Speicherplatz verfügbar.

7
Bubblewrap

Erzielt das Einstellen von HorizontalAlignment auf Stretch und Width auf Auto im Benutzersteuerelement die gewünschten Ergebnisse?

2

Verwenden Sie stattdessen Width und Height in Benutzersteuerelementen, MinHeight und MinWidth. Dann können Sie die Benutzerkontensteuerung gut konfigurieren und in einem anderen Fenster dehnen.

Nun, wie ich in WPF sehe, hat Microsoft über Windows-Eigenschaften und -Verhalten nachgedacht, aber bisher habe ich nichts von alten Windows-Formularen vermisst, in WPF sind die Steuerelemente da, aber aus einer neuen Sicht.

1

Das hat bei mir funktioniert. Weisen Sie dem UserControl keine Breite oder Höhe zu und definieren Sie die Zeilen- und Spaltendefinition im übergeordneten Fenster.

<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

Zu welchem ​​Container fügen Sie das UserControl hinzu? Wenn Sie einem Raster Steuerelemente hinzufügen, werden diese im Allgemeinen gestreckt, um den verfügbaren Platz auszufüllen (es sei denn, ihre Zeile/Spalte ist auf eine bestimmte Breite beschränkt).

1
Andy