XAML - в этом случае нельзя изменить размер элементов до ширины 0 - PullRequest
0 голосов
/ 01 февраля 2012

Учитывая следующий XAML, моя цель состоит в том, чтобы столбцы AAA, BBB, CCC всегда были видны.Колонки со списками могут изменить размер до нуля.

Если я удаляю ListBoxes, тогда приложение работает именно так, как я хочу.То есть он не имеет странного поведения, когда минимальные ширины не соблюдаются.

Со списками (или DataGrids) следующее XAML имеет такое поведение:

После запуска приложения,если я перетаскиваю разделитель SpA как можно ближе к BBB (BBB будет сохранять желаемую ширину 25), затем перетаскиваем разделитель B вправо, тогда AAA будет иметь желаемую ширину 25.

НаС другой стороны, после запуска приложения, если я перетаскиваю splitterA до конца вправо (AAA сохранит желаемую ширину 25), затем перетаскиваем splitterB до конца вправо, тогда AAA исчезнет с экрана.Удивительно, но если я затем перетащу сплиттер всего на один пиксель влево, тогда оба столбца «защелкнутся» в правильном месте.

<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 голосов
/ 02 февраля 2012

Это ошибка 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();
}
0 голосов
/ 01 февраля 2012

Я немного поигрался с кодом, и похоже, что ваша главная проблема заключается в том, что ваши GridSplitters не имеют своих собственных столбцов.

Способ работы GridSplitter заключается в том, что он корректирует столбец непосредственно влево и вправо от него. Так что простое добавление дополнительного столбца для GridSplitter не совсем обрезает его, так как в вашей таблице будет 4 столбца, и вам нужно будет воздействовать на оба столбца слева от разделителя. Поэтому я бы порекомендовал поместить их в дополнительную сетку.

Другая проблема заключается в том, что 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>

Надеюсь, это поможет!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...