none
WPF DataGrid 列の中央寄せ表示で列幅がズレる RRS feed

  • 質問

  • 下のコードを書いていますが、DataGridの列(ヘッダーを除く)を中央寄せで表示したいと思っています。
    右寄せ、左寄せでは正常に表示されますが、中央寄せにした時のみ列幅がズレて表示されるのが納得いきません。

    中央寄せで正常に表示させる方法を教えて下さい。、

    列幅がズレて表示された状態の画面    中央寄せを指定しているが、右寄せになっている
    https://box.c.yimg.jp/res/box-s-kxdvxo7paoypvum2halnj35oei-1001?uid=4734650e-14c4-416f-8782-79fbca0f1ab9&etag=0e8cdc3b1484634184118243


    ■ XAML

    <Window x:Class="MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525">
        <Grid>
            <DataGrid AutoGenerateColumns="True" BorderBrush="Black" BorderThickness="1" CanUserAddRows="True" CanUserDeleteRows="True" FontSize="14" Height="182" HorizontalScrollBarVisibility="Disabled" Margin="10,10,43,119" MinWidth="400" Name="DataGrid1" VerticalAlignment="Stretch" VerticalContentAlignment="Top" Width="450" />
        </Grid>
    </Window>

    ■ コード

    Imports System.Data
    Imports System.Windows.Controls.Primitives

    Class MainWindow

        Dim Dataview00 As New DataView

        Private Sub MT1_Loaded(sender As Object, e As System.Windows.RoutedEventArgs) Handles Me.Loaded

            Dim sty1 As New System.Windows.Style
            Dim dta1 As New DataTable
            Dim workRow As DataRow

            dta1.Columns.Add("Col1", Type.GetType("System.String"))
            dta1.Columns.Add("Col2", Type.GetType("System.Int32"))

            '1行目の表示内容
            workRow = dta1.NewRow()
            workRow(0) = "1-1________"
            workRow(1) = 11111
            dta1.Rows.Add(workRow)

            '2行目の表示内容
            workRow = dta1.NewRow()
            workRow(0) = "2-1"
            workRow(1) = 2
            dta1.Rows.Add(workRow)

            dta1.TableName = "Dummy"    '何か指定しないとエラーが出る

            Dataview00.Table = dta1

            Me.DataGrid1.ItemsSource = Dataview00

        End Sub

        Private Sub DataGrid1_AutoGeneratingColumn(sender As Object, e As System.Windows.Controls.DataGridAutoGeneratingColumnEventArgs) Handles DataGrid1.AutoGeneratingColumn

            Dim sty_右寄せ As New System.Windows.Style
            Dim sty_中寄せ As New System.Windows.Style

            sty_右寄せ.Setters.Add(New Setter(DataGridColumnHeader.HorizontalAlignmentProperty, HorizontalAlignment.Right))
            sty_中寄せ.Setters.Add(New Setter(DataGridColumnHeader.HorizontalAlignmentProperty, HorizontalAlignment.Center))

            Select Case e.PropertyName

                Case "Col1"
                    e.Column.Header = "Col.1"
                    '↓CellStyleを中央寄せにすると列幅がズレる 左寄せ、右寄せでは発生しない
                    e.Column.CellStyle = sty_中寄せ
                    e.Column.DisplayIndex = 0
                    e.Column.Width = 150
                    e.Column.IsReadOnly = False

                Case "Col2"
                    e.Column.Header = "Col.2"
                    e.Column.CellStyle = sty_右寄せ
                    e.Column.DisplayIndex = 1
                    e.Column.Width = 50
                    e.Column.IsReadOnly = False

            End Select
        End Sub

    End Class
    2017年1月17日 6:32

回答

  • sty_右寄せ.Setters.Add(New Setter(DataGridColumnHeader.HorizontalAlignmentProperty, HorizontalAlignment.Right))
    sty_中寄せ.Setters.Add(New Setter(DataGridColumnHeader.HorizontalAlignmentProperty, HorizontalAlignment.Center))

    の部分を

    sty_右寄せ.Setters.Add(New Setter(TextBlock.TextAlignmentProperty, TextAlignment.Right))
    sty_中寄せ.Setters.Add(New Setter(TextBlock.TextAlignmentProperty, TextAlignment.Center))

    とするとよいようです。

    参考サイト: http://stackoverflow.com/questions/720732/text-alignment-in-a-wpf-datagrid

    • 回答としてマーク huahi11112 2017年1月17日 7:30
    2017年1月17日 7:04

すべての返信

  • sty_右寄せ.Setters.Add(New Setter(DataGridColumnHeader.HorizontalAlignmentProperty, HorizontalAlignment.Right))
    sty_中寄せ.Setters.Add(New Setter(DataGridColumnHeader.HorizontalAlignmentProperty, HorizontalAlignment.Center))

    の部分を

    sty_右寄せ.Setters.Add(New Setter(TextBlock.TextAlignmentProperty, TextAlignment.Right))
    sty_中寄せ.Setters.Add(New Setter(TextBlock.TextAlignmentProperty, TextAlignment.Center))

    とするとよいようです。

    参考サイト: http://stackoverflow.com/questions/720732/text-alignment-in-a-wpf-datagrid

    • 回答としてマーク huahi11112 2017年1月17日 7:30
    2017年1月17日 7:04
  • kenjinoteさんの回答の通りにしたら、満足のいく結果が得られました!

    ネットを検索しても有用な情報が得られなかったので、とても助かりました。

    御回答誠にありがとうございました!

    2017年1月17日 7:32