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; }