я создаю план времени с функцией перетаскивания и использую сетки данных для их удивительной функциональности привязки данных и выбора ячеек. все работает хорошо, за исключением того, что теперь я хочу, чтобы заголовки строк (время) отображали только часы, а не получасовые сегменты.
Это то, что я хочу:
И вот что я получаю:
Есть ли способ объединить заголовки строк, не теряя функции реальных строк? Я попытался просто перекрыть заголовок строки другим полем, но это кажется неуклюжим.
Ничего не встроено в DG по умолчанию, чтобы легко достичь этого, и есть несколько способов придумать. Все это, вероятно, много работы. Вы можете пройти через RowHeaderStyle и удалить темные бордюры, которые вызывают разделение; на основе нечетных/четных индексов строк. Логично было бы оставить еще 2 заголовка строки. Вы можете использовать свой собственный шаблон управления, добавляя 1 дополнительную объединенную область заголовка, скрывая настоящие. Вы можете разделить каждую строку на 2 подстроки. Вы можете выровнять другой элемент управления левой рукой, подделывая эти объединенные заголовки...
хорошо, я думаю, что еще одно поле, где есть заголовки, является самым простым решением
Я думаю, вы могли бы сделать это с помощью Telerik radgridview, но я потерял интерес, прежде чем нашел подходящую статью.





поэтому я сделал следующее: Я создал сетку сбоку от заголовков строк, которую заполнил вдвое меньшим количеством строк, чем сетка данных. первая строка имеет заданную высоту, поэтому она соответствует высоте заголовка Datagrid, который я не хочу масштабировать, так как он содержит названия дней недели
<Grid x:Name = "Grid_Datagrid_Times_box"
Grid.Column = "1"
Grid.Row = "1"
Grid.RowSpan = "2"
Grid.ColumnSpan = "2"
HorizontalAlignment = "Stretch"
VerticalAlignment = "Stretch">
<Grid.ColumnDefinitions>
<ColumnDefinition Width = "0.3*"/>
<ColumnDefinition Width = "8*"/>
</Grid.ColumnDefinitions>
<Grid x:Name = "Grid_Times"
Grid.Column = "0">
<Grid.RowDefinitions>
<RowDefinition Height = "30"/>
</Grid.RowDefinitions>
</Grid>
<DataGrid x:Name = "DataGrid_Timetable"
Grid.Column = "1"
VerticalAlignment = "Stretch"
HorizontalAlignment = "Stretch"
ColumnHeaderHeight = "30">
...
</DataGrid>
в codebehind на Size Changed установлено
private void Datagrid_Resize(object sender, SizeChangedEventArgs e)
{
DataGrid DG = new DataGrid();
if ((sender) is DataGrid)
{
DG = (DataGrid)sender;
}
double test = DG.RowHeight;
DataGridRow rowt = GetFirstVisualChild<DataGridRow>(DG, 1);
double testR = rowt.ActualHeight;
DG.RowHeight = (Grid_Datagrid_Times_box.ActualHeight-30) / (numberOfRows);
for (int i = 0; i < (numberOfRows+2); i++)
{
DataGridRow row = GetFirstVisualChild<DataGridRow>(DG, i);
if (row != null)
{
row.FontSize = DG.RowHeight / 2.3;
row.Height = DG.RowHeight;
}
foreach (UIElement ele in Grid_Times.Children)
{
if (ele.GetType() == typeof(TextBlock))
{
TextBlock txtb = (TextBlock)ele;
txtb.FontSize = DG.RowHeight;
}
}
}
}
и
public static T GetFirstVisualChild<T>(DependencyObject depObj, int index) where T : DependencyObject
{
if (depObj != null)
{
int counter = 0;
for (int i = 0; i < VisualTreeHelper.GetChildrenCount(depObj); i++)
{
DependencyObject child = VisualTreeHelper.GetChild(depObj, i);
if (child != null && child is T )
{
counter++;
if (counter==index)
return (T)child;
}
T childItem = GetFirstVisualChild<T>(child, index);
if (childItem != null) return childItem;
}
}
return null;
}
Возможно, вы можете сделать одну строку в час и добавить DataGridTemplateColumn , чтобы разделить каждую ячейку за полчаса? Кстати, всякий раз, когда у вас есть рабочий код, предоставьте минимальный воспроизводимый пример, чтобы людям было проще воспроизвести и настроить ваш код.