Domanda

Ho una finestra con il mio controllo utente e vorrei rendere la larghezza del controllo utente uguale alla larghezza della finestra. Come farlo?

Il controllo utente è un menu orizzontale e contiene una griglia con tre colonne:

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

Questo è il motivo per cui voglio che la larghezza della finestra, estenda il controllo utente alla larghezza del 100%, con la seconda colonna relativa.

EDIT:

Sto usando una griglia, c'è il codice per 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>
È stato utile?

Soluzione

Devi assicurarti che il tuo usercontrol non abbia impostato la sua larghezza nel file xaml di usercontrol. Elimina la larghezza = " ... " da esso e sei a posto!

MODIFICA: Questo è il codice con cui l'ho provato:

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>

Altri suggerimenti

Il Canvas in WPF non fornisce molto supporto per il layout automatico. Cerco di evitarli per questo motivo (HorizontalAlignment e VerticalAlignment non funzionano come previsto), ma ho ottenuto il tuo codice per funzionare con queste piccole modifiche (vincolando la larghezza e l'altezza del controllo alla ActualWidth / ActualHeight della tela).

<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 tela è il problema qui. Se non stai effettivamente utilizzando le funzionalità offerte dalla tela in termini di layout o Z-Order "squashing" (pensa al comando appiattisci in PhotoShop), prenderei invece in considerazione l'utilizzo di un controllo come Grid, in modo da non dover imparare le stranezze di un controllo che funziona in modo diverso da quello che ti aspetti da WPF.

La tela è cruciale nella tua finestra? In caso contrario, prova a rimuoverlo e mantieni la griglia come pannello principale. La tela non ha dimensioni se non specificato, mentre una griglia normalmente occupa tutto lo spazio disponibile. All'interno dell'area di disegno, la griglia non avrà spazio disponibile.

Impostando Allineamento orizzontale su Allunga e Larghezza su Auto sul controllo utente si ottengono i risultati desiderati?

In quale contenitore stai aggiungendo UserControl? Generalmente quando aggiungi controlli a una griglia, questi si allungheranno per riempire lo spazio disponibile (a meno che la loro riga / colonna non sia limitata a una certa larghezza).

Usa invece Larghezza e Altezza nei controlli utente, usa MinHeight e MinWidth. Quindi puoi configurare bene l'UC e sarai in grado di allungare all'interno di un'altra finestra.

Bene, come sto vedendo in WPF Microsoft ha ripensato alle proprietà e ai comportamenti di Windows, ma finora non mi sono perso nulla dai vecchi moduli di Windows, in WPF i controlli ci sono, ma in un nuovo punto di view.

Questo ha funzionato per me. non assegnare alcuna larghezza o altezza a UserControl e definire la definizione di riga e colonna nella finestra principale.

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

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top