2017-07-07 41 views
2

溢了出来,我有以下XAML:帆布导致ContentControl中的孩子在控制

<Grid> 
    <Grid.ColumnDefinitions> 
     <ColumnDefinition Width="2*"/> 
     <ColumnDefinition Width="11" /> 
     <ColumnDefinition Width="3*"/> 
    </Grid.ColumnDefinitions> 
    <ListView ... Grid.Column="2"/> 
    <controls:GridSplitter 
    Grid.Column="1" 
     Width="11" 
    ResizeBehavior="BasedOnAlignment" 
    ResizeDirection="Auto" 
     Background="Gray" 
     Foreground="White" 
     FontSize="13"> 
     <controls:GridSplitter.Element> 
      <Grid> 
       <TextBlock HorizontalAlignment="Center" 
          IsHitTestVisible="False" 
          VerticalAlignment="Center" 
          Text="&#xE784;" 
          Foreground="Black" 
          FontFamily="Segoe MDL2 Assets"> 
       </TextBlock> 
      </Grid> 
     </controls:GridSplitter.Element> 
    </controls:GridSplitter> 
    <Canvas Canvas.ZIndex="1"> 
     <ContentControl MaxWidth="750" Content="{Binding CAV, Mode=TwoWay}" HorizontalContentAlignment="Stretch" VerticalContentAlignment="Stretch" /> 
    </Canvas> 
</Grid> 

没有画布第一列周围的ContentControl中包裹,在ContentControl中的孩子们正确地留在内容控制和I内可以让它更宽,以便水平地看到更多的孩子。

当我添加Canvas并设置ZIndex时,内容控件的子节点溢出了GridSplitter和ListView而不考虑contentcontrol的宽度。

效果我试图让它扩大与网格分离器的内容控件的宽度,并让该内容控件扩大“over”在列表视图(而不是减少列表视图的宽度)。

我错过了什么?我很困惑,为什么内容控件的宽度突然被忽略,只是因为我把它包装在Canvas中。还是应该不使用Canvas来获得我想要的“覆盖”效果?

回答

3

Canvas不是伸展它的孩子。它只给他们他们需要的空间。实际上,您不必将ContentControl包装在Canvas内,以设置Canvas.ZIndex;它是直接附加到ContentControl的附属财产。如果您想要一个允许孩子/孩子伸展的面板,请尝试使用Border(仅适用于单个孩子)或Grid

但是,在这里设置ZIndex对我来说似乎没有必要。由于GridSplitter只是简单地调整列的宽度,因此这里不会出现任何重叠。

如果你想覆盖效果,您需要创建另一个Grid与同一列的布局,把你的ListView那里,像下面 -

<Grid Background="{ThemeResource ApplicationPageBackgroundThemeBrush}"> 
    <Grid> 
     <Grid.ColumnDefinitions> 
      <ColumnDefinition Width="2*" /> 
      <ColumnDefinition Width="11" /> 
      <ColumnDefinition Width="3*" /> 
     </Grid.ColumnDefinitions> 
     <Grid x:Name="ListView" Background="LightGreen" Grid.Column="2" /> 
    </Grid> 
    <Grid> 
     <Grid.ColumnDefinitions> 
      <ColumnDefinition Width="2*" /> 
      <ColumnDefinition Width="11" /> 
      <ColumnDefinition Width="3*" /> 
     </Grid.ColumnDefinitions> 
     <controls:GridSplitter Grid.Column="1" Background="LightBlue"> 
     </controls:GridSplitter> 
     <Grid x:Name="ContentControl" Background="LightPink" Opacity="0.5" /> 
    </Grid> 
</Grid> 

enter image description here

1

作为附录画布告诉布局树,它不使用空格。它不关心它的孩子的大小,尽管它可能有很多孩子。作为参考,这里的画布的MeasureOverride:

protected override Size MeasureOverride(Size constraint) 
{ 
    Size childConstraint = new Size(Double.PositiveInfinity, Double.PositiveInfinity); 

    foreach (UIElement child in InternalChildren) 
    { 
     if (child == null) { continue; } 
     child.Measure(childConstraint); 
    } 

    return new Size(); 
} 

有效地说道:‘我不从事任何空间,我的孩子们可以使用任何他们想要的空间’。