2009-05-11 5 views
2

У меня есть проект, который использует DataGrid с настраиваемым шаблоном, чтобы я мог добавить специальную строку в нижнюю часть строк данных. Я хотел бы, чтобы эта специальная строка была закреплена под последней строкой, но не как часть ScrollViewer, так что она остается закрепленной под последней строкой, пока нижняя часть специальной строки не попадет в нижнюю часть сетки данных, тогда мне бы хотелось, чтобы строка с размерами до промежутка между ними и прокрутка соответственно, причем специальная строка всегда видна.Как подключить один элемент управления под другим в Silverlight?

До сих пор у меня есть мой специальный ряд как часть ScrollViewer, а также RowsPresenter. И ведущий, и специальный ряд находятся в строках с автоматическим размером Grid в пределах ScrollViewer, с ScrollViewer в строке сетки звездного размера, чтобы полоса прокрутки появлялась, когда она заканчивается из пространства. Как мне получить от этого, где строки и специальная строка прокручиваются вместе туда, где я хочу быть, где строки прокручиваются, а специальная строка закреплена внизу и всегда видна?

Хотя в моем примере используется DataGrid, я уверен, что это можно упростить вплоть до прокручиваемого элемента разной высоты и управления, закрепленного под ним. До сих пор я полагаю, что мне нужен Canvas, а не Grid, чтобы разместить мой ScrollViewer и сопутствующую специальную строку, с некоторой логикой для регулировки высот и позиций, когда ScrollViewer растет (если я могу это обнаружить), но я еще не пробовал это , Есть ли лучший способ или подходит подход Canvas?

ответ

1

Я смог решить эту проблему, используя Grid с двумя рядами, размер которых зависит от размера; строка для DataGrid и строка для моей закрепленной строки. Затем я контролирую размер Grid и, после изменения размера, посмотрим, больше ли фактический вес Grid, чем экранная недвижимость, которую он забронирует. Если это так, я меняю строку DataGrid на размер звезды, что приводит к тому, что закрепленная строка появляется в нижней части родительского элемента управления, а DataGrid отображает полосу прокрутки для своих строк. Я меняю строку на автоматическое определение размера, когда доступно больше места.

Это, очевидно, будет работать для любого сценария, где одна строка всегда должна быть на экране, но также должна быть прикреплена к нижней части другой.

пиннинга код выглядит примерно так:

RowDefinition row = this.mainGrid.RowDefinitions[0]; 
if (row.Height.GridUnitType == GridUnitType.Auto) 
{ 
    if (this.mainGrid.ActualHeight > this.ActualHeight) 
    { 
     row.Height = new GridLength(1, GridUnitType.Star); 
    } 
} 
else 
{ 
    if (this.dataGrid.DesiredSize.Height < row.ActualHeight) 
    { 
     row.Height = GridLength.Auto; 
    } 
} 
0

Во-первых, создать сетку для главного управления и возлагали управления:

<Grid Grid.Row="0" VerticalAlignment="Top"> 
    <Grid.RowDefinitions> 
     <RowDefinition Height="*" />    
     <RowDefinition Height="Auto" />    
    </Grid.RowDefinitions> 

    <!-- The main control, that is about to stretch. --> 
    <sdk:DataGrid Grid.Row="0" ItemsSource="{Binding YOUR_COLLECTION}" /> 

    <!-- The pinned control. --> 
    <TextBlock Grid.Row="1" Text="Hello World" /> 
</Grid> 

Хитрость является VerticalAlignment = «Вверх» - при основной элемент управления меньше, чем доступная высота, он перемещается в верхнюю часть доступного пространства, и под ним будет закреплено управление.

Затем поместите эту сетку в контейнер, который простирается вертикально, например, в ряду другой сетки с высотой Star:

<Grid x:Name="LayoutRoot"> 
    <Grid.RowDefinitions> 
     <!-- RowDefition for the Grid with the main control and the pinned control. --> 
     <!-- If you want to have some other controls, --> 
     <!-- add other RowDefinitions and put these controls there. --> 
     <RowDefinition Height="*" /> 
    </Grid.RowDefinitions> 

    <!-- The internal Grid for the main control and the pinned control. --> 
    <Grid Grid.Row="0" VerticalAlignment="Top"> 
     <Grid.RowDefinitions> 
      <RowDefinition Height="*" />    
      <RowDefinition Height="Auto" />    
     </Grid.RowDefinitions> 

     <sdk:DataGrid Grid.Row="0" ItemsSource="{Binding YOUR_COLLECTION}" /> 

     <TextBlock Grid.Row="1" Text="Hello World" /> 
    </Grid> 
</Grid> 

Вместо корневой сетки вы можете иметь любой другой контейнер, который растягивает по вертикали, важно то, что он пытается заполнить все свободное пространство для него.

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