可见性折叠在UI中留下一点空间

For*_*Two 6 wpf xaml

给出以下xaml结构

<Grid>
    <StackPanel>
      <TextBlock>
           <TextBlock>Block 1</TextBlock>
           <TextBlock>Block 2</TextBlock>
         </TextBlock>
      <TextBlock>
           <TextBlock Visibility="Collapsed">Block 3</TextBlock>
           <TextBlock>Block 4</TextBlock>
      </TextBlock>
      <TextBlock>
           <TextBlock>Block 5</TextBlock>
           <TextBlock>Block 6</TextBlock>
         </TextBlock>
    </StackPanel>
  </Grid>
Run Code Online (Sandbox Code Playgroud)

我期待这个输出:

Block 1 Block 2 
Block 4 
Block 5 Block 6
Run Code Online (Sandbox Code Playgroud)

但我明白了

Block 1 Block 2 
 Block 4   
Block 5 Block 6
Run Code Online (Sandbox Code Playgroud)

Block 4来自之前的空间在哪里,我该如何让它消失?

Abe*_*cht 5

通过使用Snoop,您可以看到这是来自ContainerVisual包装您孩子TextBlock的.因为TextBlock试图显示Inline派生对象的集合(这通常被抽象掉),所以它必须包装你TextBlockContainerVisual.

由于这些是由父级安排的实际对象TextBlock,并且它们甚至没有Visibility属性,因此您需要稍微重构一下代码.我想你正在尝试绑定到许多单独的属性,并希望在一个TextBlock中显示它们.您可以通过以下两种方式解决此问题:

  • 制作一个IMultiValueConverter并传递一系列属性来控制要显示的内容
  • 构造你的复杂字符串 ViewModel
  • 更换外TextBlock有一个StackPanelOrientation="Horizontal"

我推荐最后一个,因为它是最简单的.

<StackPanel>
   <StackPanel Orientation="Horizontal">
        <TextBlock>Block 1</TextBlock>
        <TextBlock>Block 2</TextBlock>
   </StackPanel>
   <StackPanel Orientation="Horizontal">
        <TextBlock Visibility="Collapsed">Block 3</TextBlock>
        <TextBlock>Block 4</TextBlock>
   </StackPanel>
   <StackPanel Orientation="Horizontal">
        <TextBlock>Block 5</TextBlock>
        <TextBlock>Block 6</TextBlock>
   </StackPanel>
</StackPanel>
Run Code Online (Sandbox Code Playgroud)