XAML - 在这种情况下无法将元素大小调整为0宽度

时间:2012-01-31 22:20:08

标签: xaml

鉴于以下XAML,我的目标是保持列AAA,BBB,CCC始终可见。具有列表框的列可以一直调整为零。

如果我删除ListBox,那么应用程序的工作方式与我想要的完全一致。也就是说,它不具有不遵守最小宽度的奇怪行为。

使用列表框(或DataGrids),以下XAML具有以下行为:

启动应用程序后,如果我将分离器A一直拖到靠近BBB的位置(BBB将保持所需的宽度为25),则将分离器B一直向右拖动,然后AAA将具有所需的宽度25。

另一方面,在启动应用程序后,如果我将splitterA一直向右拖动(AAA将保持所需的宽度为25),然后将splitterB一直拖到右边,然后AAA将关闭屏幕。令人惊讶的是,如果我然后将splitterA向左拖动一个像素,则两列将“捕捉”到正确的位置。

<Grid Background="CadetBlue" >
  <Grid.ColumnDefinitions>
    <ColumnDefinition Width="Auto"/>
    <ColumnDefinition />
    <ColumnDefinition MinWidth="60"/>
  </Grid.ColumnDefinitions>
  <TextBlock Text="CCC" Width="25"  />
  <ListBox Grid.Column="1"  />
  <GridSplitter Width="5" Grid.Column="2" Name="splitterB" HorizontalAlignment="Left" />
  <Grid Background="Aqua" Grid.Column="2" Margin="5,0,0,0" >
    <Grid.ColumnDefinitions>
      <ColumnDefinition Width="Auto"/>
      <ColumnDefinition />
      <ColumnDefinition MinWidth="30"/>
    </Grid.ColumnDefinitions>
    <TextBlock Text="BBB" Width="25"  />
    <ListBox Grid.Column="1"  />

    <GridSplitter Width="5" Grid.Column="2" Name="splitterA" HorizontalAlignment="Left"  />
    <Grid Background="BurlyWood"  Grid.Column="2" Margin="5,0,0,0" >
      <Grid.ColumnDefinitions>
        <ColumnDefinition Width="Auto" />
        <ColumnDefinition />
      </Grid.ColumnDefinitions>
      <TextBlock Text="AAA" Width="25"  />
      <ListBox Grid.Column="1"  />
    </Grid>
  </Grid>
</Grid>

为什么删除列表框时它会起作用?

注意:我稍微修改了问题和XAML代码以澄清事情,并且还显示了我刚刚找到的关于列表框的内容。

2 个答案:

答案 0 :(得分:0)

我一直在玩代码,看起来你的主要问题在于你的GridSplitters没有自己的列。

GridSplitter的工作方式是立即将列调整到左侧并立即调整到右侧。因此,简单地为GridSplitter添加一个额外的列将不会完全削减它,因为您的Grid中将有4列,并且您需要分割器左侧的两列都受到影响。所以我建议把它们放在一个额外的Grid中。

另一个问题是外网格上的MinWidth为50,不考虑GridSplitter的宽度,所以它应该是55.

似乎整件事情可以更干净地完成,但由于我不确定你要完成什么,我保持代码的“精神”完整并更新了一些东西:

<Grid Background="CadetBlue">
    <Grid.ColumnDefinitions>
        <ColumnDefinition MinWidth="50" Width="Auto"/>
        <ColumnDefinition Width="3*"/>
        <ColumnDefinition MinWidth="55" Width="5*"/>
    </Grid.ColumnDefinitions>
    <TextBlock Text="CCC" />
    <ListBox Grid.Column="0"/>
    <GridSplitter Width="5" Grid.Column="1" />
    <Grid Background="Aqua" Grid.Column="2">
        <Grid.ColumnDefinitions>
            <ColumnDefinition MinWidth="25"/>
            <ColumnDefinition Width="3*"/>
            <ColumnDefinition MinWidth="25" Width="5*" />
        </Grid.ColumnDefinitions>
        <TextBlock Text="BBB"/>
        <ListBox Margin="0,20,10,20"/>
        <GridSplitter Width="5" Grid.Column="1" />
        <Grid Background="BurlyWood" Grid.Column="2">
            <Grid.ColumnDefinitions>
                <ColumnDefinition Width="Auto" />
                <ColumnDefinition Width="*"/>
            </Grid.ColumnDefinitions>
            <TextBlock Text="AAA" Width="25" />
            <ListBox Margin="0,20,10,20" Grid.Column="1" />
        </Grid>
    </Grid>
</Grid>

希望这有帮助!

答案 1 :(得分:0)

这是一个WPF错误:

https://connect.microsoft.com/VisualStudio/feedback/details/636072/msdn-forum-grid-layout-issue-with-minwidth-starsizing

http://social.msdn.microsoft.com/Forums/en/wpf/thread/24460784-7d09-4627-89fe-975e0ca7b303

我用黑客攻击了它。如果有人有更好的解决方案,我很乐意听到它......

XAML:

<Grid Background="CadetBlue" >
  <Grid.ColumnDefinitions>
    <ColumnDefinition Width="Auto"/>
    <ColumnDefinition />
    <ColumnDefinition MinWidth="60"/>
  </Grid.ColumnDefinitions>
  <TextBlock Text="CCC" Width="25"  />
  <ListBox Grid.Column="1"  />
  <GridSplitter Width="5" Grid.Column="2" Name="splitterB" HorizontalAlignment="Left" DragDelta="splitterB_DragDelta" />
  <Grid Background="Aqua" Grid.Column="2" Margin="5,0,0,0" >
    <Grid.ColumnDefinitions>
      <ColumnDefinition Width="Auto"/>
      <ColumnDefinition Name="bbbColumn"/>
      <ColumnDefinition MinWidth="30"/>
    </Grid.ColumnDefinitions>
    <TextBlock Text="BBB" Width="25"  />
    <ListBox Grid.Column="1" Name="bbbListBox" />

    <GridSplitter Width="5" Grid.Column="2" Name="splitterA" HorizontalAlignment="Left" DragDelta="splitterA_DragDelta" />
    <Grid Background="BurlyWood"  Grid.Column="2" Margin="5,0,0,0" >
      <Grid.ColumnDefinitions>
        <ColumnDefinition Width="Auto" />
        <ColumnDefinition />
      </Grid.ColumnDefinitions>
      <TextBlock Text="AAA" Width="25"  />
      <ListBox Grid.Column="1"  />
    </Grid>
  </Grid>
</Grid>

代码:

private void ToggleWidths()
{
  if (bbbColumn.ActualWidth < 10
    && bbbListBox.Visibility != System.Windows.Visibility.Collapsed)
    bbbListBox.Visibility = System.Windows.Visibility.Collapsed;
  else if (bbbColumn.ActualWidth >= 10
    && bbbListBox.Visibility != System.Windows.Visibility.Visible)
    bbbListBox.Visibility = System.Windows.Visibility.Visible;
}

private void splitterA_DragDelta(object sender, System.Windows.Controls.Primitives.DragDeltaEventArgs e)
{
  ToggleWidths();
}

private void splitterB_DragDelta(object sender, System.Windows.Controls.Primitives.DragDeltaEventArgs e)
{
  ToggleWidths();
}