如何将WPF用户控件的宽度拉伸到其窗口?

时间:2009-01-20 18:05:26

标签: c# .net wpf xaml wpf-controls

我有一个带有我的用户控件的窗口,我想使usercontrol宽度等于窗口宽度。怎么做?

用户控件是一个水平菜单,包含一个包含三列的网格:

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

这就是我想要窗口宽度的原因,将用户控件拉伸到100%宽度,第二列是相对的。

编辑:

我正在使用网格,有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>

7 个答案:

答案 0 :(得分:42)

您需要确保您的usercontrol未在usercontrol的xaml文件中设置其宽度。只需从中删除Width =“...”,就可以了!

编辑:这是我测试过的代码:

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>

答案 1 :(得分:21)

WPF中的Canvas没有提供太多的自动布局支持。我试图避开它们因为这个原因(Horizo​​ntalAlignment和VerticalAlignment不能按预期工作),但我得到了你的代码来处理这些微小的修改(将控件的宽度和高度绑定到画布的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>

Canvas是这里的问题。如果你实际上没有使用画布在布局或Z-Order“压缩”方面提供的功能(想想PhotoShop中的flatten命令),我会考虑使用像Grid这样的控件而不是你最终必须学习控件的怪癖,这种控制的工作方式与WPF所期望的不同。

答案 2 :(得分:7)

Canvas在你的窗口中是否至关重要?如果没有,请尝试将其删除并将Grid作为主面板。除非指定,否则Canvas没有大小,而Grid通常会占用所有可用空间。在Canvas中,Grid将没有可用空间。

答案 3 :(得分:2)

将Horizo​​ntalAlignment设置为Stretch,并将用户控件上的Width设置为Auto可以达到预期效果吗?

答案 4 :(得分:1)

您要将UserControl添加到哪个容器?通常,当您向Grid添加控件时,它们将拉伸以填充可用空间(除非它们的行/列被约束到某个宽度)。

答案 5 :(得分:1)

而是在用户控件中使用“宽度”和“高度”,使用MinHeight和MinWidth。 然后你可以很好地配置UC,并且可以在其他窗口内拉伸。

好吧,正如我在WPF中所看到的那样,微软重新思考了Windows的属性和行为,但到目前为止,我没有错过任何来自旧版Windows窗体的内容,在WPF中控件存在,但是在新的一点上图。

答案 6 :(得分:0)

这对我有用。 不要为UserControl指定任何宽度或高度,并在父窗口中定义行和列定义。

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