[WPF] DataGrid - Scrollbar слева и другое
От: Hex66 Россия  
Дата: 24.11.11 11:43
Оценка:
Здравствуйте всем!

Не могу найти возможность:
— Как указать в XAML для DataGrid свойство отрисоваться VerticalScrollBar-у слева ?

— Есть ли возможность в XAML достучаться до контрола некоторого визуадбного элемента?
Например: у этого DataGrid получить ScrollBar, чтобы уже ему указать свойство HorizontalAlignment ="Left"

— Имеется ли уже встроенное средство при деструкции DataGrid-a сохранить размерности и порядок колонок,
что при повторном запуске использовать эти значения для отображения?
Если нет, то куда дальше смотреть?
интересуют свойства колонок: порядок, размер, видимость.

Спасибо.
wpf datagrid scrollbar
Re: [WPF] DataGrid - Scrollbar слева и другое
От: vit_as Россия  
Дата: 24.11.11 12:58
Оценка: 3 (1) +1
Здравствуйте, 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> в файл. Ну и при следующем открытии таблицы, загружать последние настройки из файла.
Re[2]: [WPF] DataGrid - Scrollbar слева и другое
От: Hex66 Россия  
Дата: 24.11.11 16:13
Оценка:
Здравствуйте, 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 ?
Или можно что поправиль в уже имеющемся коде ?
Re: [WPF] DataGrid - Scrollbar слева и другое
От: Hex66 Россия  
Дата: 25.11.11 16:26
Оценка:
Здравствуйте, 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.
Re[2]: [WPF] DataGrid - Scrollbar слева и другое
От: Hex66 Россия  
Дата: 28.03.12 10:44
Оценка:
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

Пробую прикрутить его в своем коде
Re[3]: [WPF] DataGrid - Scrollbar слева и другое
От: Hex66 Россия  
Дата: 28.03.12 13:16
Оценка:
Здравствуйте, 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, но почему-то не видно колонок. Не могу понять почему . Может кто посмотрел этот пример и сможет подсказать, что
нужно доинициализовать, чтобы показались колонки?
Re[2]: [WPF] DataGrid - Scrollbar слева и другое
От: Hex66 Россия  
Дата: 28.03.12 14:41
Оценка:
Здравствуйте, 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. Возможно ли это? Чтобы первая (верхняя) запись датагрида показывалась полностью?
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.