2012-12-04 67 views
1

在我的应用程序中,我使用ContentControl并动态使用自定义UserControl填充它,使用Content上的绑定绑定到FrameworkElement。 [编辑:添加示例代码来显示该问题]嵌套UserControl的自动调整大小不起作用

我创建了一个小MVVM项目重现该问题史蒂芬和Charleh的一些输入之后。我的主窗口现在看起来像这样:

<Window x:Class="ResizeExample.MainWindow" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
    mc:Ignorable="d" 
    xmlns:localVM="clr-namespace:ResizeExample.ViewModels" 
    xmlns:local="clr-namespace:ResizeExample" 
    Title="ResizeExample" 
    WindowStartupLocation="CenterScreen" 
    Height="459" 
    Width="795"> 
<Window.Resources> 
    <localVM:MainWindowViewModel x:Key="Windows1ViewModel" /> 
</Window.Resources> 

<Grid DataContext="{StaticResource Windows1ViewModel}"> 
    <Grid.RowDefinitions> 
     <RowDefinition Height="50" /> 
     <RowDefinition Height="*" /> 
    </Grid.RowDefinitions> 
    <Canvas Grid.Row="0"> 
     <Menu DockPanel.Dock="Top"/> 
     <Label Content="Any Label on the right side" Canvas.Right="0" Canvas.Bottom="0"/> 
    </Canvas> 
    <Grid Grid.Row="1" HorizontalAlignment="Stretch" VerticalAlignment="Stretch"> 
     <ContentControl Name="ControlCanvas" Content="{Binding Path=externalView}" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" HorizontalContentAlignment="Stretch" VerticalContentAlignment="Stretch"/> 
    </Grid> 
</Grid> 

设置externalView工作正常,但是当窗口大小不会调整。在这里我怎么来实现它在视图模型:

private FrameworkElement _externalView; 
    public FrameworkElement externalView 
    { 
     get { return this._externalView; } 
     set 
     { 
      if (this._externalView != value) 
      { 
       this._externalView = value; 
       RaisePropertyChanged(() => externalView); 
      } 
     } 
    } 

    public MainWindowViewModel() 
    { 
     externalView = new UserControl1(); 
    } 

UserControl包含TabControl(这应该调整)和其他一切是在TabControlTabControl包含一些标签,文本框和按钮(不应调整大小)和DataGrid(应调整大小)。目前整个TabControl已被最小化,因为没有设置大小,它不会调整大小。

<UserControl x:Class="ResizeExample.Views.UserControl1" 
     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" 
     d:DesignHeight="411" d:DesignWidth="805" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" > 
<Grid HorizontalAlignment="Stretch" VerticalAlignment="Stretch" > 
    <TabControl HorizontalAlignment="Left" Name="tabControl1" VerticalAlignment="Top"> 
     <TabItem Header="Tab1" Name="Tab1"> 
      <Grid /> 
     </TabItem> 
     <TabItem Header="Tab2" Name="Tab2"> 
      <Grid> 
       <TextBox Height="23" HorizontalAlignment="Left" Margin="6,6,0,0" Name="textBox1" VerticalAlignment="Top" Width="357" /> 
       <Label Content="Input some data 1:" Height="28" HorizontalAlignment="Left" Margin="6,29,0,0" Name="label1" VerticalAlignment="Top" /> 
       <Label Content="Input some data 2:" Height="28" HorizontalAlignment="Left" Margin="6,57,0,0" Name="label2" VerticalAlignment="Top" /> 
       <Label Content="Input some data 3:" Height="28" HorizontalAlignment="Left" Margin="6,85,0,0" Name="label3" VerticalAlignment="Top" /> 
       <DataGrid AutoGenerateColumns="False" MinHeight="200" HorizontalAlignment="Left" Margin="6,113,0,0" Name="releaseNotesGrid" VerticalAlignment="Top" MinWidth="780" /> 
      </Grid> 
     </TabItem> 
    </TabControl> 
</Grid> 
</UserControl> 

我认为控件会自动调整大小,但这是行不通的。虽然我是WPF和MVVM的新手,但可能是因为我错过了一些基本的东西。

我发现the following thread之后,我删除了尺寸和添加的路线,但这并没有解决我的问题。

回答

4

我现在解决它通过测试了一下。问题是在UserControlTabControlDataGrid,其中有未与舒展的工作路线。这是我现在的UserControl1,它为我工作得很好:

<UserControl x:Class="ResizeExample.Views.UserControl1" 
     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" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" HorizontalContentAlignment="Stretch" VerticalContentAlignment="Stretch"> 
<Grid HorizontalAlignment="Stretch" VerticalAlignment="Stretch" > 
    <TabControl HorizontalAlignment="Stretch" Name="tabControl1" VerticalAlignment="Stretch"> 
     <TabItem Header="Tab1" Name="Tab1"> 
      <Grid /> 
     </TabItem> 
     <TabItem Header="Tab2" Name="Tab2" VerticalContentAlignment="Stretch" HorizontalContentAlignment="Stretch"> 
      <Grid> 
       <TextBox Height="23" HorizontalAlignment="Left" Margin="6,6,0,0" Name="textBox1" VerticalAlignment="Top" Width="357" /> 
       <Label Content="Input some data 1:" Height="28" HorizontalAlignment="Left" Margin="6,29,0,0" Name="label1" VerticalAlignment="Top" /> 
       <Label Content="Input some data 2:" Height="28" HorizontalAlignment="Left" Margin="6,57,0,0" Name="label2" VerticalAlignment="Top" /> 
       <Label Content="Input some data 3:" Height="28" HorizontalAlignment="Left" Margin="6,85,0,0" Name="label3" VerticalAlignment="Top" /> 
       <DataGrid AutoGenerateColumns="False" MinHeight="200" Margin="6,113,0,0" Name="releaseNotesGrid" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" MinWidth="780" /> 
      </Grid> 
     </TabItem> 
    </TabControl> 
</Grid> 
</UserControl> 

感谢史蒂芬和Charleh点我到正确的方向。

1

Canvas不会自动调整其子内容到容器的大小。使用例如

尝试代替Grid

+0

谢谢,我不知道画布不会自动调整大小。不幸的是,它不能解决问题,但我现在添加了一个示例代码。 – MikeR

2

除了史蒂文斯回答,您可能还需要设置ContentControl.HorizontalContentAlignmentContentControl.VerticalContentAlignmentStretchContentControl默认值分别为LeftTop(据我记得)

否则即使ContentControl将填补父容器,内容将不会

编辑:这是为ContentControl显示默认值默认模板...

<Style TargetType="ContentControl"> 
    <Setter Property="Foreground" Value="#FF000000"/> 
    <Setter Property="HorizontalContentAlignment" Value="Left"/> 
    <Setter Property="VerticalContentAlignment" Value="Top"/> 
    <Setter Property="Template"> 
     <Setter.Value> 
      <ControlTemplate TargetType="ContentControl"> 
       <ContentPresenter 
        Content="{TemplateBinding Content}" 
        ContentTemplate="{TemplateBinding ContentTemplate}" 
        Cursor="{TemplateBinding Cursor}" 
        Margin="{TemplateBinding Padding}" 
        HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" 
        VerticalAlignment="{TemplateBinding VerticalContentAlignment}"/> 
      </ControlTemplate> 
     </Setter.Value> 
    </Setter> 

+0

我向ContentControl添加了'Horizo​​ntalContentAlignment =“Stretch”VerticalContentAlignment =“Stretch”',但这并不能解决问题。我编辑了我的帖子并添加了完整的示例。 – MikeR