75 lines
2.8 KiB
C#
75 lines
2.8 KiB
C#
using Microsoft.UI.Xaml;
|
||
using Microsoft.UI.Xaml.Controls;
|
||
using Microsoft.UI.Xaml.Media;
|
||
using SQLVision.Core.Enums;
|
||
using SQLVision.Core.Models;
|
||
using SQLVision.Visualizers.Interfaces;
|
||
using System.Data;
|
||
|
||
namespace SQLVision.Visualizers.Visualizers;
|
||
|
||
public class TableVisualizer : IVisualizer
|
||
{
|
||
public FrameworkElement Visualize(DataTable data, OutputDefinition definition)
|
||
{
|
||
var listView = new ListView
|
||
{
|
||
ItemsSource = data.DefaultView,
|
||
SelectionMode = ListViewSelectionMode.None,
|
||
IsItemClickEnabled = false,
|
||
HorizontalAlignment = HorizontalAlignment.Stretch,
|
||
VerticalAlignment = VerticalAlignment.Stretch
|
||
};
|
||
|
||
// Автоматическое создание колонок
|
||
listView.ItemTemplate = CreateDataTemplate(data);
|
||
|
||
var scrollViewer = new ScrollViewer
|
||
{
|
||
Content = listView,
|
||
HorizontalScrollBarVisibility = ScrollBarVisibility.Auto,
|
||
VerticalScrollBarVisibility = ScrollBarVisibility.Auto,
|
||
MaxHeight = 600
|
||
};
|
||
|
||
return scrollViewer;
|
||
}
|
||
|
||
private DataTemplate CreateDataTemplate(DataTable data)
|
||
{
|
||
var gridFactory = new FrameworkElementFactory(typeof(Grid));
|
||
|
||
// Создаем колонки
|
||
foreach (DataColumn column in data.Columns)
|
||
{
|
||
var columnDefinition = new ColumnDefinition();
|
||
gridFactory.AppendChild(columnDefinition);
|
||
}
|
||
|
||
// Создаем строку с текстовыми блоками
|
||
var stackPanelFactory = new FrameworkElementFactory(typeof(StackPanel));
|
||
stackPanelFactory.SetValue(StackPanel.OrientationProperty, Orientation.Horizontal);
|
||
|
||
foreach (DataColumn column in data.Columns)
|
||
{
|
||
var borderFactory = new FrameworkElementFactory(typeof(Border));
|
||
borderFactory.SetValue(Border.BorderThicknessProperty, new Thickness(0, 0, 1, 1));
|
||
borderFactory.SetValue(Border.BorderBrushProperty, new SolidColorBrush(Colors.LightGray));
|
||
|
||
var textBlockFactory = new FrameworkElementFactory(typeof(TextBlock));
|
||
textBlockFactory.SetBinding(TextBlock.TextProperty,
|
||
new Microsoft.UI.Xaml.Data.Binding { Path = new PropertyPath($"[{column.ColumnName}]") });
|
||
textBlockFactory.SetValue(TextBlock.MarginProperty, new Thickness(4));
|
||
textBlockFactory.SetValue(TextBlock.VerticalAlignmentProperty, VerticalAlignment.Center);
|
||
|
||
borderFactory.AppendChild(textBlockFactory);
|
||
stackPanelFactory.AppendChild(borderFactory);
|
||
}
|
||
|
||
gridFactory.AppendChild(stackPanelFactory);
|
||
|
||
return new DataTemplate { VisualTree = gridFactory };
|
||
}
|
||
|
||
public bool CanVisualize(OutputType type) => type == OutputType.Table;
|
||
} |