Как привязать к предпочтительному размеру ListView? - PullRequest
0 голосов
/ 28 марта 2012

У меня есть WPF ListView, который должен быть расширен с помощью всегда видимого нижнего колонтитула.Нижний колонтитул должен вести себя как заголовок и не должен быть прокручен.Следующий XAML использует внешний ScrollViewer, связанный с кодом позади, для управления ScrollViewer ListView:

<Window x:Class="LayoutTests.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="125" Width="176">
  <Grid>
    <StackPanel>
      <ListView Name="L" ScrollViewer.HorizontalScrollBarVisibility="Hidden">
        <ListViewItem Content="Brown brownie with a preference for white wheat."/>
        <ListViewItem Content="Red Redish with a taste for oliv olives."/>
      </ListView>
      <ScrollViewer CanContentScroll="False" HorizontalScrollBarVisibility="Auto" VerticalScrollBarVisibility="Auto" ScrollChanged="ScrollViewer_ScrollChanged">
        <!-- Would like to bind Rectangle.Width to the preferred width of L -->
        <Rectangle Height="20" Width="500" Fill="Red"/>
      </ScrollViewer>
    </StackPanel>
  </Grid>
</Window>

В коде позади это выглядит так:* определяется следующим образом (но неважно):

public static DependencyObject GetScrollViewer(DependencyObject depObj)
{
  if (depObj is ScrollViewer)
  { return depObj; }
  for (int i = 0; i < VisualTreeHelper.GetChildrenCount(depObj); i++)
  {
    var child = VisualTreeHelper.GetChild(depObj, i);
    var result = GetScrollViewer(child);
    if (result == null) { continue; }
    else { return result; }
  }
  return null;
}

ScrollViewer из ListView, очевидно, знает о предпочтительной ширине его дочерних элементов.Проблема в том, что я не могу найти способ привязки к этой ширине.Итак, вот оно:

Как связать Rectangle.Width с предпочтительным размером ListView?

Или, альтернативно, как включить нижний колонтитул в ListViewвсегда виден?

1 Ответ

1 голос
/ 28 марта 2012

Вам необходимо связать против ExtentWidth вашего ScrollViewer. Согласно http://msdn.microsoft.com/en-us/library/system.windows.controls.scrollviewer.extentwidth.aspx, это DependencyProperty. Имейте в виду, что вам нужно ScrollViewer вашего ListView, а не дополнительный, который вы создаете под представлением списка.

Вы можете использовать функцию GetScrollViewer, чтобы найти ScrollViewer на ListView. Конечно, вам нужно установить привязку в коде позади. Примерно так:

Binding b = new Binding("ExtentWidth") { Source = GetScrollViewer(L) };
rect.SetBinding(Rectangle.WidthProperty, b);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...