|
@@ -271,86 +271,90 @@ public class DynamicGridTreeUIComponent<T> : IDynamicGridUIComponent<T>, IDynami
|
|
|
|
|
|
private void _tree_Loaded(object sender, RoutedEventArgs e)
|
|
private void _tree_Loaded(object sender, RoutedEventArgs e)
|
|
{
|
|
{
|
|
- _summaryRow = new Grid();
|
|
|
|
- _summaryRow.Visibility = Visibility.Collapsed;
|
|
|
|
-
|
|
|
|
- var scroll = _tree.FindChild<ScrollViewer>("PART_ScrollViewer");
|
|
|
|
- if(scroll is not null)
|
|
|
|
|
|
+ Application.Current.Dispatcher.BeginInvoke(() =>
|
|
{
|
|
{
|
|
- var grid = scroll.FindVisualChildren<Grid>(recursive: false).FirstOrDefault();
|
|
|
|
- if(grid is not null)
|
|
|
|
- {
|
|
|
|
- var row1 = grid.RowDefinitions[0];
|
|
|
|
- var row2 = grid.RowDefinitions[1];
|
|
|
|
- grid.RowDefinitions.Clear();
|
|
|
|
- grid.RowDefinitions.Add(row1);
|
|
|
|
- var rowDef = grid.AddRow(GridUnitType.Auto);
|
|
|
|
|
|
|
|
- grid.RowDefinitions.Add(row2);
|
|
|
|
|
|
+ _summaryRow = new Grid();
|
|
|
|
+ _summaryRow.Visibility = Nodes is not null && Summaries.Count > 0 ? Visibility.Visible : Visibility.Collapsed;
|
|
|
|
|
|
- foreach(var child in grid.Children.OfType<UIElement>())
|
|
|
|
|
|
+ var scroll = _tree.FindChild<ScrollViewer>("PART_ScrollViewer");
|
|
|
|
+ if(scroll is not null)
|
|
|
|
+ {
|
|
|
|
+ var grid = scroll.FindVisualChildren<Grid>(recursive: false).FirstOrDefault();
|
|
|
|
+ if(grid is not null)
|
|
{
|
|
{
|
|
- var row = Grid.GetRow(child);
|
|
|
|
- if(row >= 1)
|
|
|
|
- {
|
|
|
|
- Grid.SetRow(child, row + 1);
|
|
|
|
- }
|
|
|
|
- else
|
|
|
|
|
|
+ var row1 = grid.RowDefinitions[0];
|
|
|
|
+ var row2 = grid.RowDefinitions[1];
|
|
|
|
+ grid.RowDefinitions.Clear();
|
|
|
|
+ grid.RowDefinitions.Add(row1);
|
|
|
|
+ var rowDef = grid.AddRow(GridUnitType.Auto);
|
|
|
|
+
|
|
|
|
+ grid.RowDefinitions.Add(row2);
|
|
|
|
+
|
|
|
|
+ foreach(var child in grid.Children.OfType<UIElement>())
|
|
{
|
|
{
|
|
- var rowSpan = Grid.GetRowSpan(child);
|
|
|
|
- if(row + rowSpan >= 1 && child is ScrollBar)
|
|
|
|
|
|
+ var row = Grid.GetRow(child);
|
|
|
|
+ if(row >= 1)
|
|
|
|
+ {
|
|
|
|
+ Grid.SetRow(child, row + 1);
|
|
|
|
+ }
|
|
|
|
+ else
|
|
{
|
|
{
|
|
- Grid.SetRowSpan(child, rowSpan + 1);
|
|
|
|
|
|
+ var rowSpan = Grid.GetRowSpan(child);
|
|
|
|
+ if(row + rowSpan >= 1 && child is ScrollBar)
|
|
|
|
+ {
|
|
|
|
+ Grid.SetRowSpan(child, rowSpan + 1);
|
|
|
|
+ }
|
|
}
|
|
}
|
|
}
|
|
}
|
|
- }
|
|
|
|
- var horizontalScrollbar = grid.Children.OfType<ScrollBar>().First(x => x.Orientation == Orientation.Horizontal);
|
|
|
|
|
|
+ var horizontalScrollbar = grid.Children.OfType<ScrollBar>().First(x => x.Orientation == Orientation.Horizontal);
|
|
|
|
|
|
- var treeGridPanel = scroll.FindChild<TreeGridPanel>("PART_TreeGridPanel");
|
|
|
|
|
|
+ var treeGridPanel = scroll.FindChild<TreeGridPanel>("PART_TreeGridPanel");
|
|
|
|
|
|
- var summaryScroll = new ScrollViewer
|
|
|
|
- {
|
|
|
|
- VerticalScrollBarVisibility = ScrollBarVisibility.Hidden,
|
|
|
|
- HorizontalScrollBarVisibility = ScrollBarVisibility.Hidden
|
|
|
|
- };
|
|
|
|
- summaryScroll.Content = _summaryRow;
|
|
|
|
|
|
+ var summaryScroll = new ScrollViewer
|
|
|
|
+ {
|
|
|
|
+ VerticalScrollBarVisibility = ScrollBarVisibility.Hidden,
|
|
|
|
+ HorizontalScrollBarVisibility = ScrollBarVisibility.Hidden
|
|
|
|
+ };
|
|
|
|
+ summaryScroll.Content = _summaryRow;
|
|
|
|
|
|
- scroll.ScrollChanged += (o, e) =>
|
|
|
|
- {
|
|
|
|
- summaryScroll.ScrollToHorizontalOffset(scroll.HorizontalOffset);
|
|
|
|
|
|
+ scroll.ScrollChanged += (o, e) =>
|
|
|
|
+ {
|
|
|
|
+ summaryScroll.ScrollToHorizontalOffset(scroll.HorizontalOffset);
|
|
|
|
|
|
- var panel = treeGridPanel;
|
|
|
|
- };
|
|
|
|
|
|
+ var panel = treeGridPanel;
|
|
|
|
+ };
|
|
|
|
|
|
- var transform = new TranslateTransform();
|
|
|
|
- summaryScroll.RenderTransform = transform;
|
|
|
|
|
|
+ var transform = new TranslateTransform();
|
|
|
|
+ summaryScroll.RenderTransform = transform;
|
|
|
|
|
|
- void UpdateSize(double height)
|
|
|
|
- {
|
|
|
|
- var desiredHeight = treeGridPanel.RowHeights.TotalExtent;
|
|
|
|
- if(desiredHeight < height)
|
|
|
|
|
|
+ void UpdateSize(double height)
|
|
{
|
|
{
|
|
- var diff = height - desiredHeight;
|
|
|
|
- transform.Y = -diff - 1;
|
|
|
|
- }
|
|
|
|
- else
|
|
|
|
- {
|
|
|
|
- transform.Y = 0;
|
|
|
|
|
|
+ var desiredHeight = treeGridPanel.RowHeights.TotalExtent;
|
|
|
|
+ if(desiredHeight < height)
|
|
|
|
+ {
|
|
|
|
+ var diff = height - desiredHeight;
|
|
|
|
+ transform.Y = -diff - 1;
|
|
|
|
+ }
|
|
|
|
+ else
|
|
|
|
+ {
|
|
|
|
+ transform.Y = 0;
|
|
|
|
+ }
|
|
}
|
|
}
|
|
- }
|
|
|
|
|
|
|
|
- treeGridPanel.SizeChanged += (o, e) =>
|
|
|
|
- {
|
|
|
|
- UpdateSize(e.NewSize.Height);
|
|
|
|
- };
|
|
|
|
- _tree.FilterChanged += (o, e) =>
|
|
|
|
- {
|
|
|
|
- UpdateSize(treeGridPanel.ActualHeight);
|
|
|
|
- };
|
|
|
|
|
|
+ treeGridPanel.SizeChanged += (o, e) =>
|
|
|
|
+ {
|
|
|
|
+ UpdateSize(e.NewSize.Height);
|
|
|
|
+ };
|
|
|
|
+ _tree.FilterChanged += (o, e) =>
|
|
|
|
+ {
|
|
|
|
+ UpdateSize(treeGridPanel.ActualHeight);
|
|
|
|
+ };
|
|
|
|
|
|
- grid.AddChild(summaryScroll, 1, 0);
|
|
|
|
|
|
+ grid.AddChild(summaryScroll, 1, 0);
|
|
|
|
+ }
|
|
}
|
|
}
|
|
- }
|
|
|
|
|
|
+ });
|
|
}
|
|
}
|
|
|
|
|
|
private class TreeGridSelectionControllerExt(SfTreeGrid treeGrid, DynamicGridTreeUIComponent<T> grid) : TreeGridRowSelectionController(treeGrid)
|
|
private class TreeGridSelectionControllerExt(SfTreeGrid treeGrid, DynamicGridTreeUIComponent<T> grid) : TreeGridRowSelectionController(treeGrid)
|
|
@@ -716,7 +720,7 @@ public class DynamicGridTreeUIComponent<T> : IDynamicGridUIComponent<T>, IDynami
|
|
var image = imgCol.Image?.Invoke(null);
|
|
var image = imgCol.Image?.Invoke(null);
|
|
if (image != null)
|
|
if (image != null)
|
|
{
|
|
{
|
|
- var template = new ControlTemplate(typeof(GridHeaderCellControl));
|
|
|
|
|
|
+ var template = new ControlTemplate(typeof(TreeGridHeaderCell));
|
|
var border = new FrameworkElementFactory(typeof(Border));
|
|
var border = new FrameworkElementFactory(typeof(Border));
|
|
border.SetValue(Border.BackgroundProperty, new SolidColorBrush(Colors.Gainsboro));
|
|
border.SetValue(Border.BackgroundProperty, new SolidColorBrush(Colors.Gainsboro));
|
|
border.SetValue(Border.PaddingProperty, new Thickness(4));
|
|
border.SetValue(Border.PaddingProperty, new Thickness(4));
|
|
@@ -1014,7 +1018,7 @@ public class DynamicGridTreeUIComponent<T> : IDynamicGridUIComponent<T>, IDynami
|
|
|
|
|
|
var headstyle = GetHeaderCellStyle(column);
|
|
var headstyle = GetHeaderCellStyle(column);
|
|
headstyle.Setters.Add(new EventSetter(Control.MouseLeftButtonUpEvent, new MouseButtonEventHandler(HeaderCell_LeftMouseButtonEvent)));
|
|
headstyle.Setters.Add(new EventSetter(Control.MouseLeftButtonUpEvent, new MouseButtonEventHandler(HeaderCell_LeftMouseButtonEvent)));
|
|
- newcol.HeaderStyle = GetHeaderCellStyle(column);
|
|
|
|
|
|
+ newcol.HeaderStyle = headstyle;
|
|
|
|
|
|
_tree.Columns.Add(newcol);
|
|
_tree.Columns.Add(newcol);
|
|
ColumnList.Add(column);
|
|
ColumnList.Add(column);
|
|
@@ -1306,6 +1310,8 @@ public class DynamicGridTreeUIComponent<T> : IDynamicGridUIComponent<T>, IDynami
|
|
|
|
|
|
private void RebuildSummaryRow()
|
|
private void RebuildSummaryRow()
|
|
{
|
|
{
|
|
|
|
+ if (_summaryRow is null) return;
|
|
|
|
+
|
|
_summaryRow.RowDefinitions.Clear();
|
|
_summaryRow.RowDefinitions.Clear();
|
|
_summaryRow.ColumnDefinitions.Clear();
|
|
_summaryRow.ColumnDefinitions.Clear();
|
|
_summaryRow.Children.Clear();
|
|
_summaryRow.Children.Clear();
|
|
@@ -1465,7 +1471,10 @@ public class DynamicGridTreeUIComponent<T> : IDynamicGridUIComponent<T>, IDynami
|
|
nodes.ColumnChanged += Nodes_ColumnChanged;
|
|
nodes.ColumnChanged += Nodes_ColumnChanged;
|
|
Nodes = nodes;
|
|
Nodes = nodes;
|
|
_tree.ItemsSource = nodes.Nodes;
|
|
_tree.ItemsSource = nodes.Nodes;
|
|
- _summaryRow.Visibility = Visibility.Visible;
|
|
|
|
|
|
+ if(_summaryRow is not null && Summaries.Count > 0)
|
|
|
|
+ {
|
|
|
|
+ _summaryRow.Visibility = Visibility.Visible;
|
|
|
|
+ }
|
|
|
|
|
|
CalculateSummaries();
|
|
CalculateSummaries();
|
|
|
|
|