WPF horizontal DataGrid

Me gustaría tener un WGD DataGrid con una orientación horizontal, ¿alguien sabe una solución?

    Lo he hecho antes, ya que queríamos poder usar el mismo control para un DataGrid y un PropertyGrid . Se deben cambiar muchas cosas (como alineación, desplazamiento, posicionamiento de flechas de ordenación, etc.). Hay mucho código para publicar toda la solución, pero esto debería ayudarte a comenzar. Este es un ejemplo con columnas de texto generadas automáticamente, pero puede modificarlo fácilmente para usar otros tipos de columna.

    texto alternativo

                 

    Y cuando se generan las Columnas, invertimos sus posiciones y rotamos TextBlocks y TextBoxes (Esto es mejor que rotar el DataGridCell en términos de alineación, desenfoque, etc.)

     private void c_dataGridScrollViewer_Loaded(object sender, RoutedEventArgs e) { // Add MouseWheel support for the datagrid scrollviewer. c_dataGrid.AddHandler(MouseWheelEvent, new RoutedEventHandler(DataGridMouseWheelHorizontal), true); } private void DataGridMouseWheelHorizontal(object sender, RoutedEventArgs e) { MouseWheelEventArgs eargs = (MouseWheelEventArgs)e; double x = (double)eargs.Delta; double y = c_dataGridScrollViewer.VerticalOffset; c_dataGridScrollViewer.ScrollToVerticalOffset(y - x); } private void c_dataGrid_AutoGeneratedColumns(object sender, EventArgs e) { TransformGroup transformGroup = new TransformGroup(); transformGroup.Children.Add(new RotateTransform(90)); foreach (DataGridColumn dataGridColumn in c_dataGrid.Columns) { if (dataGridColumn is DataGridTextColumn) { DataGridTextColumn dataGridTextColumn = dataGridColumn as DataGridTextColumn; Style style = new Style(dataGridTextColumn.ElementStyle.TargetType, dataGridTextColumn.ElementStyle.BasedOn); style.Setters.Add(new Setter(TextBlock.MarginProperty, new Thickness(0, 2, 0, 2))); style.Setters.Add(new Setter(TextBlock.LayoutTransformProperty, transformGroup)); style.Setters.Add(new Setter(TextBlock.HorizontalAlignmentProperty, HorizontalAlignment.Center)); Style editingStyle = new Style(dataGridTextColumn.EditingElementStyle.TargetType, dataGridTextColumn.EditingElementStyle.BasedOn); editingStyle.Setters.Add(new Setter(TextBox.MarginProperty, new Thickness(0, 2, 0, 2))); editingStyle.Setters.Add(new Setter(TextBox.LayoutTransformProperty, transformGroup)); editingStyle.Setters.Add(new Setter(TextBox.HorizontalAlignmentProperty, HorizontalAlignment.Center)); dataGridTextColumn.ElementStyle = style; dataGridTextColumn.EditingElementStyle = editingStyle; } } List dataGridColumns = new List(); foreach (DataGridColumn dataGridColumn in c_dataGrid.Columns) { dataGridColumns.Add(dataGridColumn); } c_dataGrid.Columns.Clear(); dataGridColumns.Reverse(); foreach (DataGridColumn dataGridColumn in dataGridColumns) { c_dataGrid.Columns.Add(dataGridColumn); } } 

    Realmente estoy de pie sobre los hombros de gigantes aquí 🙂 pero, tengo una mejora adicional.

    @dimaKudr sugirió una forma de transformar columnas predefinidas sin código detrás, y @FrankE refinó el orden de las columnas. Lo que estoy agregando es una forma de transformar columnas generadas automáticamente ( AutoGenerateColumns="True" ), utilizando la plantilla DataGrid.CellStyle . Entonces, la solución completa (y bastante elegante) es:

                   

    He simplificado un poco la solución anterior. No me gusta la magia negra con scrollviewer adicional, así que no la uso. Pero en su lugar utilizo la transformación de escala adicional.

              

    En el caso de una lista predefinida de columnas, es posible transfomar el contenido de las celdas directamente en XAML:

      

    Esto le permite escapar completamente del código subyacente.

    Encontré este enfoque muy útil, sin embargo hice una rotación y un reflection:

     TransformGroup transformGroup = new TransformGroup(); transformGroup.Children.Add(new RotateTransform(90)); transformGroup.Children.Add(new MatrixTransform(-1, 0, 0, 1, 0, 0)); 

    o en Xaml:

            

    Al usar el reflection, tengo el campo al final de la lista de columnas en la parte inferior en lugar de en la parte superior.