Здравствуйте, Hex66, Вы писали:
H>Здравствуйте всем!
H>Не могу найти возможность:
H>- Как указать в XAML для DataGrid свойство отрисоваться VerticalScrollBar-у слева ?
Нужно переопределить шаблон для DataGrid
<Style x:Key="{x:Type DataGrid}" TargetType="{x:Type DataGrid}">
<Setter Property="Background"
Value="{DynamicResource {x:Static SystemColors.ControlBrushKey}}"/>
<Setter Property="Foreground"
Value="{DynamicResource {x:Static SystemColors.ControlTextBrushKey}}"/>
<Setter Property="BorderBrush" Value="#FF688CAF" />
<Setter Property="BorderThickness" Value="1" />
<Setter Property="RowDetailsVisibilityMode" Value="VisibleWhenSelected" />
<Setter Property="ScrollViewer.CanContentScroll"
Value="true"/>
<Setter Property="ScrollViewer.PanningMode"
Value="Both"/>
<Setter Property="Stylus.IsFlicksEnabled"
Value="False"/>
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type DataGrid}">
<Border Background="{TemplateBinding Background}"
BorderBrush="{TemplateBinding BorderBrush}"
BorderThickness="{TemplateBinding BorderThickness}"
SnapsToDevicePixels="True"
Padding="{TemplateBinding Padding}">
<ScrollViewer Focusable="false"
Name="DG_ScrollViewer">
<ScrollViewer.Template>
<ControlTemplate TargetType="{x:Type ScrollViewer}">
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="Auto"/>
<RowDefinition Height="*"/>
<RowDefinition Height="Auto"/>
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto"/>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="Auto"/>
</Grid.ColumnDefinitions>
<Button Command="{x:Static DataGrid.SelectAllCommand}"
Width="{Binding RelativeSource={RelativeSource AncestorType={x:Type DataGrid}}, Path=CellsPanelHorizontalOffset}"
Style="{DynamicResource {ComponentResourceKey TypeInTargetAssembly={x:Type DataGrid}, ResourceId=DataGridSelectAllButtonStyle}}"
Focusable="false"
Visibility="{Binding RelativeSource={RelativeSource AncestorType={x:Type DataGrid}}, Path=HeadersVisibility, Converter={x:Static DataGrid.HeadersVisibilityConverter}, ConverterParameter={x:Static DataGridHeadersVisibility.All}}" />
<DataGridColumnHeadersPresenter Grid.Column="1"
Name="PART_ColumnHeadersPresenter"
Visibility="{Binding RelativeSource={RelativeSource AncestorType={x:Type DataGrid}}, Path=HeadersVisibility, Converter={x:Static DataGrid.HeadersVisibilityConverter}, ConverterParameter={x:Static DataGridHeadersVisibility.Column}}"/>
<ScrollContentPresenter x:Name="PART_ScrollContentPresenter" Grid.Row="1" Grid.Column="1" Grid.ColumnSpan="2" CanContentScroll="{TemplateBinding CanContentScroll}" />
<ScrollBar Grid.Row="1" Grid.Column="0" Name="PART_VerticalScrollBar"
Orientation="Vertical"
Maximum="{TemplateBinding ScrollableHeight}"
ViewportSize="{TemplateBinding ViewportHeight}"
Value="{Binding Path=VerticalOffset, RelativeSource={RelativeSource TemplatedParent}, Mode=OneWay}"
Visibility="{TemplateBinding ComputedVerticalScrollBarVisibility}"/>
<Grid Grid.Row="2" Grid.Column="1">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="{Binding RelativeSource={RelativeSource AncestorType={x:Type DataGrid}}, Path=NonFrozenColumnsViewportHorizontalOffset}"/>
<ColumnDefinition Width="*"/>
</Grid.ColumnDefinitions>
<ScrollBar Grid.Column="1"
Name="PART_HorizontalScrollBar"
Orientation="Horizontal"
Maximum="{TemplateBinding ScrollableWidth}"
ViewportSize="{TemplateBinding ViewportWidth}"
Value="{Binding Path=HorizontalOffset, RelativeSource={RelativeSource TemplatedParent}, Mode=OneWay}"
Visibility="{TemplateBinding ComputedHorizontalScrollBarVisibility}"/>
</Grid>
</Grid>
</ControlTemplate>
</ScrollViewer.Template>
<ItemsPresenter SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" />
</ScrollViewer>
</Border>
</ControlTemplate>
</Setter.Value>
</Setter>
<Style.Triggers>
<Trigger Property="IsGrouping" Value="true">
<Setter Property="ScrollViewer.CanContentScroll" Value="false"/>
</Trigger>
</Style.Triggers>
</Style>
H>- Имеется ли уже встроенное средство при деструкции DataGrid-a сохранить размерности и порядок колонок,
H>что при повторном запуске использовать эти значения для отображения?
H>Если нет, то куда дальше смотреть?
H>интересуют свойства колонок: порядок, размер, видимость.
лучше всего создать класс свойств
class ColumnProps
{
public double Width{get;set;}
public int Index{get;set;}
public bool IsVisible {get;set;}
}
Для каждой колонки создать экземпляр такого класса, прибиндить соответствующие свойства контрола. Для этого класса можно реализовать INotifyPropertyChanged, чтобы работала обратная связь.
По закрытию DataGrid'а нужно сериализовать состояние List<ColumnProps> в файл. Ну и при следующем открытии таблицы, загружать последние настройки из файла.
Здравствуйте, vit_as, Вы писали:
_>Здравствуйте, Hex66, Вы писали:
H>>Здравствуйте всем!
H>>Не могу найти возможность:
H>>- Как указать в XAML для DataGrid свойство отрисоваться VerticalScrollBar-у слева ?
_>Нужно переопределить шаблон для DataGrid
_>_> <Grid>
_> <Grid.RowDefinitions>
_> <RowDefinition Height="Auto"/>
_> <RowDefinition Height="*"/>
_> <RowDefinition Height="Auto"/>
_> </Grid.RowDefinitions>
_> <Grid.ColumnDefinitions>
_> <ColumnDefinition Width="Auto"/>
_> <ColumnDefinition Width="*"/>
_> <ColumnDefinition Width="Auto"/>
_> </Grid.ColumnDefinitions>
_> <Button Command="{x:Static DataGrid.SelectAllCommand}"
_> Width="{Binding RelativeSource={RelativeSource AncestorType={x:Type DataGrid}}, Path=CellsPanelHorizontalOffset}"
_> Style="{DynamicResource {ComponentResourceKey TypeInTargetAssembly={x:Type DataGrid}, ResourceId=DataGridSelectAllButtonStyle}}"
_> Focusable="false"
_> Visibility="{Binding RelativeSource={RelativeSource AncestorType={x:Type DataGrid}}, Path=HeadersVisibility, Converter={x:Static DataGrid.HeadersVisibilityConverter}, ConverterParameter={x:Static DataGridHeadersVisibility.All}}" />
_> <DataGridColumnHeadersPresenter Grid.Column="1"
_> Name="PART_ColumnHeadersPresenter"
_> Visibility="{Binding RelativeSource={RelativeSource AncestorType={x:Type DataGrid}}, Path=HeadersVisibility, Converter={x:Static DataGrid.HeadersVisibilityConverter}, ConverterParameter={x:Static DataGridHeadersVisibility.Column}}"/>
_> <ScrollContentPresenter x:Name="PART_ScrollContentPresenter" Grid.Row="1" Grid.Column="1" Grid.ColumnSpan="2" CanContentScroll="{TemplateBinding CanContentScroll}" />
_> <ScrollBar Grid.Row="1" Grid.Column="0" Name="PART_VerticalScrollBar"
_> Orientation="Vertical"
_> Maximum="{TemplateBinding ScrollableHeight}"
_> ViewportSize="{TemplateBinding ViewportHeight}"
_> Value="{Binding Path=VerticalOffset, RelativeSource={RelativeSource TemplatedParent}, Mode=OneWay}"
_> Visibility="{TemplateBinding ComputedVerticalScrollBarVisibility}"/>
_> <Grid Grid.Row="2" Grid.Column="1">
_> <Grid.ColumnDefinitions>
_> <ColumnDefinition Width="{Binding RelativeSource={RelativeSource AncestorType={x:Type DataGrid}}, Path=NonFrozenColumnsViewportHorizontalOffset}"/>
_> <ColumnDefinition Width="*"/>
_> </Grid.ColumnDefinitions>
_>
Спасибо, сработало. Только один момент не так.
Размер одного столбца задан как Width="*" , чтобы все колонки были видимыми и полностью занимали видимую область DataGrid.
До переноса ScrollBar-а налево, все было ОК. Сейчас место старого расположения ScrollBar-а не заполняется.
Для решения сей проблемы стоит аналогичным образом полностью переопределить шаблон для DataGridColumnHeadersPresenter ?
Или можно что поправиль в уже имеющемся коде ?
Здравствуйте, Hex66, Вы писали:
H>Здравствуйте всем!
H>Не могу найти возможность:
H>- Как указать в XAML для DataGrid свойство отрисоваться VerticalScrollBar-у слева ?
остановился на следующем решении:
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="*" />
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto" />
<ColumnDefinition Width="*"/>
</Grid.ColumnDefinitions>
<ScrollBar Grid.Column="0" Grid.Row="0" Orientation="Vertical" />
<DataGrid Name="MyDataGrid" Grid.Column="1"
VerticalScrollBarVisibility="Hidden"
HorizontalScrollBarVisibility="Auto" />
</Grid>
Мне все-равно предстояло самому обрабатывать скролинг, так как он должен прокручивать еще Grid и TreeView.
H>>- Имеется ли уже встроенное средство при деструкции DataGrid-a сохранить размерности и порядок колонок,
H>>что при повторном запуске использовать эти значения для отображения?
H>>Если нет, то куда дальше смотреть?
H>>интересуют свойства колонок: порядок, размер, видимость.
_>лучше всего создать класс свойств
_>_>class ColumnProps
_>{
_>public double Width{get;set;}
_>public int Index{get;set;}
_>public bool IsVisible {get;set;}
_>}
_>
_>Для каждой колонки создать экземпляр такого класса, прибиндить соответствующие свойства контрола. Для этого класса можно реализовать INotifyPropertyChanged, чтобы работала обратная связь.
_>По закрытию DataGrid'а нужно сериализовать состояние List<ColumnProps> в файл. Ну и при следующем открытии таблицы, загружать последние настройки из файла.
Нашел следующий пример:
http://bengribaudo.com/blog/2012/03/14/1942/saving-restoring-wpf-datagrid-columns-size-sorting-and-order
Пробую прикрутить его в своем коде
Здравствуйте, Hex66, Вы писали:
H>>>- Имеется ли уже встроенное средство при деструкции DataGrid-a сохранить размерности и порядок колонок,
H>>>что при повторном запуске использовать эти значения для отображения?
H>>>Если нет, то куда дальше смотреть?
H>>>интересуют свойства колонок: порядок, размер, видимость.
_>>лучше всего создать класс свойств
...
_>>По закрытию DataGrid'а нужно сериализовать состояние List<ColumnProps> в файл. Ну и при следующем открытии таблицы, загружать последние настройки из файла.
H>Нашел следующий пример:
H>http://bengribaudo.com/blog/2012/03/14/1942/saving-restoring-wpf-datagrid-columns-size-sorting-and-order
H>Пробую прикрутить его в своем коде
Пробую использовать сей DataGrid, но почему-то не видно колонок. Не могу понять почему

. Может кто посмотрел этот пример и сможет подсказать, что
нужно доинициализовать, чтобы показались колонки?
Здравствуйте, Hex66, Вы писали:
H>Здравствуйте, Hex66, Вы писали:
H>>Здравствуйте всем!
H>>Не могу найти возможность:
H>>- Как указать в XAML для DataGrid свойство отрисоваться VerticalScrollBar-у слева ?
H>остановился на следующем решении:
H>H> <Grid>
H> <Grid.RowDefinitions>
H> <RowDefinition Height="*" />
H> </Grid.RowDefinitions>
H> <Grid.ColumnDefinitions>
H> <ColumnDefinition Width="Auto" />
H> <ColumnDefinition Width="*"/>
H> </Grid.ColumnDefinitions>
H> <ScrollBar Grid.Column="0" Grid.Row="0" Orientation="Vertical" />
H> <DataGrid Name="MyDataGrid" Grid.Column="1"
H> VerticalScrollBarVisibility="Hidden"
H> HorizontalScrollBarVisibility="Auto" />
H> </Grid>
H>
H>Мне все-равно предстояло самому обрабатывать скролинг, так как он должен прокручивать еще Grid и TreeView.
Обнаружилась неприятность: прокрутка в датагриде и во втором View работает с разным шагом. Не могу найти возможность установки шага прокрутки на размер DataGridRow.Height. Возможно ли это? Чтобы первая (верхняя) запись датагрида показывалась полностью?