How to stretch in width a WPF user control to its window?

后端 未结 7 1755
执念已碎
执念已碎 2021-01-31 14:52

I have a Window with my user control and I would like to make usercontrol width equals window width. How to do that?

The user control is a horizontal menu and contains a

相关标签:
7条回答
  • 2021-01-31 15:05

    This worked for me. don't assign any width or height to the UserControl and define row and column definition in the parent window.

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

    0 讨论(0)
  • 2021-01-31 15:08

    Does setting the HorizontalAlignment to Stretch, and the Width to Auto on the user control achieve the desired results?

    0 讨论(0)
  • 2021-01-31 15:14

    What container are you adding the UserControl to? Generally when you add controls to a Grid, they will stretch to fill the available space (unless their row/column is constrained to a certain width).

    0 讨论(0)
  • 2021-01-31 15:16

    Is the Canvas crucial in your window? If not, try removing it and keep the Grid as the main panel. Canvas has no size unless specified, while a Grid normally takes up all available space. Inside the Canvas, the Grid will have no available space.

    0 讨论(0)
  • 2021-01-31 15:19

    You need to make sure your usercontrol hasn't set it's width in the usercontrol's xaml file. Just delete the Width="..." from it and you're good to go!

    EDIT: This is the code I tested it with:

    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 讨论(0)
  • 2021-01-31 15:25

    The Canvas in WPF doesn't provide much automatic layout support. I try to steer clear of them for this reason (HorizontalAlignment and VerticalAlignment don't work as expected), but I got your code to work with these minor modifications (binding the Width and Height of the control to the canvas's ActualWidth/ActualHeight).

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

    The Canvas is the problem here. If you're not actually utilizing the features the canvas offers in terms of layout or Z-Order "squashing" (think of the flatten command in PhotoShop), I would consider using a control like a Grid instead so you don't end up having to learn the quirks of a control that works differently than you have come to expect with WPF.

    0 讨论(0)
提交回复
热议问题