2016-05-26 2 views
0

У меня есть ListView, который показывает полосы прокрутки. Чтобы достичь этого, я помещаю свой ListView в границах, расположенных в сетке, как показано ниже:WPF XAML ListView с ScrollBars

<Window ... 
    MinWidth="600" MinHeight="500" Width="800" Height="500" 
    Topmost="True" 
    WindowStartupLocation="CenterScreen" 
    SizeToContent="Height" WindowStyle="None"> 

    <Window.Resources> 
     <ResourceDictionary> 
      ... 
     </ResourceDictionary> 
    </Window.Resources> 

    <Grid> 
     <Grid.RowDefinitions> 
      <RowDefinition Height="Auto"/> 
      <RowDefinition Height="*" MinHeight="60"/> 
      <RowDefinition Height="48"/> 
     </Grid.RowDefinitions> 

     <Grid.ColumnDefinitions> 
      <ColumnDefinition Width="*"/> 
      <ColumnDefinition Width="10"/> 
      <ColumnDefinition Width="*"/> 
     </Grid.ColumnDefinitions> 

     <Grid Grid.Row="1"> 
      <Grid.RowDefinitions> 
       <RowDefinition Height="32"/> 
       <RowDefinition Height="370"/> <-- THIS IS HARDCODED TO 370 BUT I NEED IT TO BE RESIZABLE 
      </Grid.RowDefinitions> 

      <Grid Margin="5,0,0,0"> 
       <Grid.ColumnDefinitions> 
        <ColumnDefinition Width="4"/> 
        <ColumnDefinition Width="346*"/> 
       </Grid.ColumnDefinitions> 
       <TextBlock Text="{Binding MyName}" Grid.Column="1" 
         Style="{StaticResource MyNameStyle}" Margin="0,5,0,5" /> 

      </Grid> 

      <Border BorderBrush="{StaticResource MyBrush}" Grid.Row="1" Grid.Column="0" > 
       <ListView 
        x:Name="lstMyListView" 
        Margin="0,0,0,0" 
        BorderBrush="Transparent" 
        ItemsSource="{Binding MyItems}" 
        SelectedIndex="0" 
        ScrollViewer.CanContentScroll="True" 
        ScrollViewer.VerticalScrollBarVisibility="Auto"> 
        ... 
        ... 
       </ListView> 
       ... 
       ... 
      </Border> 
      ... 
      ... 
     </Grid> 
    </Grid> 
</Window> 

Это все в форме, изменяемые. Поэтому ListView также должен изменять размер, но он должен делать это только тогда, когда пользователь изменяет размер формы. Проблема с моим жестким кодированным значением выше очевидна, ListView не будет изменять размер, но останется на постоянной высоте = 370.

Я знаю, что могу установить это на 370 *, но в этом случае мой список изменит размер, чтобы соответствовать всем элементам. Я хочу ограничить это, так что изменение размера происходит только тогда, когда пользователь изменяет размер формы. Таким образом, ListView должен показывать полосы прокрутки, если есть больше элементов, и по мере изменения размера пользователя эта полоса прокрутки должна уходить, если форма изменяется на высоту, которая может вместить все элементы в ListView.

UPDATE: Вместо жесткого кодирования высоту до 370 выше, я попытался установить высоту , Авто, и 370. Все это расширит ListView (и, следовательно, форму тоже), чтобы разместить все элементы в ListView.

ОБНОВЛЕНИЕ 2: Обновлен XAML, чтобы показать всю структуру дерева.

UPDATE 3: По предложению Рахили, установить жёстко 370 на «*» в комментировал строке выше в XAML и что производит формы с измененным размером, так что ListView подходит для всех элементов в нем. Я добавил скриншот, показывающий форму, когда она открывается, и снимок экрана, показывающий, как он должен выглядеть, когда он открывается. Как вы можете видеть, он изменяет размеры в высоту, чтобы разместить весь itesm.

Что мне нужно, так это то, что форма и ListView остаются в установленном размере и изменяются только в том случае, если пользователь изменяет размер формы.

enter image description here

+0

Изменить 370 на '*' и, возможно, просто использовать 370 в качестве MinHeight. –

+0

@ChrisW. Это не работает. Я уже пытался использовать 370 *, * и Auto.Все они будут расширять форму и ListView до размера, который учитывает все элементы в ListView. Очень ценится Крис – pixel

+0

Возможно, я не понимаю ваше общее намерение. 370 * недействительно, * просто давайте использовать это пространство, Auto берет только то, что ему нужно. –

ответ

1

Если я правильно понял ваш вопрос, вы говорите, что форма загружается как слишком большая по размеру, потому что ListView растет до полной высоты. Если это так, удалите SizeToContent="Height" из тега <Window>, так как он делает начальную высоту окна равной любой высоте контента, которая включает в себя полный размер ListView.

+0

Спасибо Рэйчел, что разрешило это. – pixel

0

Привет Я думаю, что у меня есть понимаю. Таким образом, я пытаюсь:

Итак, вы хотите иметь свой ListView по крайней мере высоту 370, а затем только изменяет если окнаизменяет (инкремент и декремент окна размер).

Установка MinHeight 2-го RowDefinition может помочь

<Grid Grid.Row="1"> 
     <Grid.RowDefinitions> 
      <RowDefinition Height="32"/> 
      <RowDefinition MinHeight="370"/> <!-- THIS IS HARDCODED....--> 
     </Grid.RowDefinitions> 
..... 
</Grid> 

Спасибо.

+0

К сожалению, это не работает. Это просто устанавливает MinHeight. Я обновил свой вопрос с помощью некоторых скриншотов, чтобы объяснить. – pixel

+1

Ваше высказывание _Что мне нужно, чтобы форма и ListView оставались в своем размере и изменялись только в том случае, если пользователь меняет размер формы. Итак, ** minheight ** должен работать, ** ListView ** будет только 370, и размер будет равен увеличивается, когда размер формы увеличивается, и наоборот. А когда уменьшается, минимальная высота _ListView_ будет равна 370 (ваш установленный размер). – Tops

+0

@MrTop Спасибо, но ответ Рэйчел разрешает проблему. Тем не менее, многие оценили усилия. – pixel

Смежные вопросы