2011-11-15 6 views
2

Я работаю над приложением WPF и используя scrollViewer для просмотра содержимого, которое отключает область экрана. Работать нормально, никаких проблем.Проблема с ScrollViewer в WPF

Но если мое окно содержит Listbox или Grid или что-то в этом роде, и этот элемент управления имеет много записей, то вместо добавления полосы прокрутки к себе он просто увеличивает высоту самого элемента управления и окна, поскольку scrollviewer считает, что он должен расширяться ,

Я не хочу жестко задавать высоту списка, потому что это делает его одинаковым в разных разрешениях, я хочу, чтобы он увеличивал его высоту, но не всегда, поскольку scrollviewer делает это.

Благодаря

ответ

5

Вы не можете включать в себя переменную высота/ширина объекта внутри ScrollViewer без установки высоты/ширины зрителя.

Средство просмотра прокрутки эффективно имеет бесконечную высоту, поэтому сетка расширяется, чтобы заполнить «доступное» пространство - следовательно, эффект, который вы видите. Как отмечает @JoeWhite в своих комментариях, ScrollViewer - это контейнер, который может быть таким же высоким, каким должен быть весь его контент. Анкеровка не помогла бы - по сути, ваш ListBox уже привязан, он просто привязан к чему-то, что говорит «о, я буду тем размером, в котором вы нуждаетесь, чтобы быть».

Вам необходимо либо ограничить высоту, либо переместить ListBox за пределы ScrollViewer, либо использовать что-либо, кроме ScrollViewer.

Снова цитируя @Joe «Это опасения поместить прокручиваемую область внутри другой области прокрутки - это плохое удобство использования, и трудно определить поведение».

+0

Спасибо, у нас есть что-нибудь подобное ЯКОРЬ свойство окна формы в WPF? –

+2

@MSingh, вы помещаете его в ScrollViewer. ScrollViewer - это контейнер, который может быть таким же высоким, каким должен быть весь контент. Анкерование не помогло бы - фактически, ваш ListBox уже * закреплен, он просто привязан к чему-то, что говорит «о, я буду тем размером, в котором вы нуждаетесь, чтобы быть». Это опасения поместить прокручиваемую область внутри другой области прокрутки - это плохое удобство использования, и трудно определить поведение. –

+3

Каждый раз, когда мне приходится иметь дело с ScrollViewer, я знаю, что это будет плохой день. :) – MetalMikester

1

Вы можете обернуть ScrollViewer в сетку и связать свойства ширины и высоты scrollviewer с фактическим значением ширины сетки и фактическим весом. Таким образом, scrollviewer будет иметь фиксированный размер, равный размеру сетки, который изменится при изменении размера окна.

Пример:

<Grid x:Name="LayoutRoot" Background="White"> 
    <Grid Background="#FFF1F1F1" Height="49" VerticalAlignment="Top"> 
     <Button Content="Обзор" Margin="0,13,175.25,0" VerticalAlignment="Top" FontSize="14.667" HorizontalAlignment="Right" Width="95.147"> 
     </Button> 
     <Label Content="{Binding DocPath, Converter={StaticResource FileNameConverter}, FallbackValue=Выберите файл, TargetNullValue=Выберите файл}" HorizontalAlignment="Left" VerticalAlignment="Top" Width="342.603" Margin="10,10,0,0" Height="33"/> 
     <Button Content="Загрузить данные" HorizontalAlignment="Right" Margin="0,13,10,0" VerticalAlignment="Top" Width="151.147" FontSize="14.667"> 
     </Button> 
    </Grid> 
    <Grid x:Name="scrollBorder" Margin="10,54,10,10"> 
     <ScrollViewer x:Name="LogScroller" VerticalScrollBarVisibility="Auto" HorizontalScrollBarVisibility="Auto" 
         HorizontalAlignment="Left" VerticalAlignment="Top" 
         Height="{Binding ActualHeight, ElementName=scrollBorder}" Width="{Binding ActualWidth, ElementName=scrollBorder}" > 
      <ItemsControl ItemsSource="{Binding Log}" /> 
     </ScrollViewer> 
    </Grid> 
</Grid> 
Смежные вопросы