如何在宽度上拉伸一个WPF用户控件到其窗口?

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

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

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

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

编辑:

我正在使用网格,有窗口的代码:

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

你需要确保你的usercontrol没有在usercontrol的xaml文件中设置它的宽度。 只要删除宽度=“…”,你就可以走了!

编辑:这是我testing它的代码:

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> 

WPF中的canvas不提供太多的自动布局支持。 由于这个原因(Horizo​​ntalAlignment和VerticalAlignment不能像预期的那样工作),我试图避开它们,但是我得到了代码来处理这些小修改(将控件的宽度和高度绑定到canvas的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提供的布局function或Z-Order“挤压”function(想想PhotoShop中的flatten命令),我会考虑使用像Grid这样的控件,所以你不会最终不得不学习控制的怪癖,这种控制与WPF所期望的不同。

帆布在你的窗口是至关重要的? 如果没有,请尝试删除它,并保持网格为主面板。 canvas没有大小,除非指定,而网格通常占用所有可用空间。 在canvas内部,网格将没有可用空间。

在用户控件上设置“水平alignment”为“拉伸”并将“宽度”设置为“自动”可获得所需的结果?

什么容器你添加UserControl? 通常,当您将控件添加到网格时,它们将伸展以填充可用空间(除非它们的行/列被限制到特定的宽度)。

而是在用户控件中使用宽度和高度,请使用MinHeight和MinWidth。 那么你可以很好地configurationUC,并能够在其他窗口内拉伸。

那么,正如我在WPF中看到的,微软对Windows属性和行为做了一个重新思考,但到目前为止,我没有错过任何来自于老式Windows窗体的东西,WPF中的控件在那里,但是以一个新的观点。

这对我有效。 不要为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>