2009-01-20 10 views
38

Ich habe ein Fenster mit meinem Benutzer Steuerelement und ich möchte Benutzersteuerbreite gleich Fensterbreite machen. Wie geht das?Wie dehnt man in der Breite ein WPF-Benutzersteuerelement auf sein Fenster aus?

Die Benutzersteuerung ist eine horizontale Menü und enthält ein Raster mit drei Spalten:

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

Das ist der Grund, weshalb ich die Fensterbreite soll, den Benutzer der Kontrolle auf 100% Breite strecken, mit der zweiten Säule relativ.

EDIT:

ich ein Gitter verwende, es ist der Code für Fenster:

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

Antwort

38

Sie müssen sicherstellen, dass Ihr Benutzersteuerelement seine Breite nicht in der XAML-Datei des Benutzersteuerelements festgelegt hat. Löschen Sie einfach die Width = "..." und Sie können loslegen!

EDIT: Dies ist der Code, den ich es getestet mit:

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

Vielen Dank für die Aufmerksamkeit, Arjan. Es funktioniert auch hier gut, aber mein Fenster hat keine Width = "415" eingestellt, weil es als Vollbild gestaltet ist. Wenn ich die Breite einstelle, funktioniert es gut. –

1

Welche Container hinzufügen Sie das Usercontrol? Wenn Sie Steuerelemente zu einem Raster hinzufügen, werden sie in der Regel so gestreckt, dass sie den verfügbaren Platz ausfüllen (sofern ihre Zeile/Spalte nicht auf eine bestimmte Breite beschränkt ist).

2

Erreicht die Einstellung HorizontalAlignment auf Strecken und die Breite auf Auto auf dem Benutzersteuerelement die gewünschten Ergebnisse?

7

ist die Leinwand entscheidend in Ihrem Fenster? Wenn nicht, versuche es zu entfernen und behalte das Grid als Hauptfenster. Canvas hat keine Größe, sofern nicht angegeben, während ein Grid normalerweise den gesamten verfügbaren Platz belegt. Innerhalb des Canvas verfügt das Grid über keinen verfügbaren Speicherplatz.

20

Das Canvas in WPF bietet nicht viel automatische Layoutunterstützung. Aus diesem Grund versuche ich, mich von ihnen fernzuhalten (HorizontalAlignment und VerticalAlignment funktionieren nicht wie erwartet), aber ich habe Ihren Code mit diesen kleinen Änderungen arbeiten lassen (die Breite und Höhe des Steuerelements an ActualWidth/ActualHeight des Canvas gebunden).

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

Das Canvas ist das Problem hier. Wenn Sie nicht die Funktionen nutzen, die die Leinwand in Bezug auf Layout oder Z-Order "Squashing" bietet (denken Sie an den Befehl flatten in PhotoShop), würde ich stattdessen ein Steuerelement wie ein Grid verwenden, damit Sie nicht enden Sie müssen die Macken eines Steuerelements lernen, das anders funktioniert als Sie es von WPF gewohnt sind.

+0

Danke, die Bindung an ActualWidth half mir in einem Projekt, wo ich ein benutzerdefiniertes UserControl in einem StackPanel hatte. Das StackPanel verwendete HorizontalAlignement = Strecken und nahm die gesamte Breite, aber die Benutzersteuerung blieb bei 0 Breite. Durch das Binden des Benutzersteuerelements an das übergeordnete Stackpanel ActualWidth wurde es für mich gelöst. –

1

Verwenden Sie stattdessen Width und Height in Benutzersteuerelementen, verwenden Sie MinHeight und MinWidth. Dann können Sie den UC gut konfigurieren und in der Lage sein, innerhalb eines anderen Fensters zu strecken.

Nun, wie ich in WPF sehen Microsoft machte ein neues Denken über Windows-Eigenschaften und Verhaltensweisen, aber bis jetzt, ich vermisste nichts von olds Windows Forms, in WPF die Steuerelemente sind da, aber an einem neuen Punkt Sicht.

0

Das funktionierte für mich. Weisen Sie dem Benutzersteuerelement 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> 

Verwandte Themen