4

を使用するItemsControlがあり、Grid.ColumnとGrid.Rowをに設定してGridデータアイテムをグリッドに配置しますItemsPanelTemplateItemContainerStyle

GridLinesをグリッドに追加する方法、または空白のセルに境界線を入力する方法はありますか?

現在ShowGridLines、点線を作成するTrueに設定していますが、水平線を表示したいので、実線のGridLineを使用します。

スクリーンショット

かなり大量のXAMLがありますが、これが私のXAMLのレイアウトのスクリーンショットです。 XAMLレイアウト

4

1 に答える 1

5

申し訳ありませんが、グリッド ラインのスタイリングは実行できません。少なくとも簡単な方法ではありません。説明については、次の質問を参照してください: WPF でグリッドのグリッド線の色を変更するにはどうすればよいですか?

MSDN ドキュメントには、「このプロパティはレイアウトの問題をデバッグするための設計ツールとして意図されており、製品品質のコードでの使用を意図していないため、点線のみが使用可能です。グリッド内の線が必要な場合は、グリッド内の要素に境界線を設定します。 ."

編集:境界線が必要な場合は、カスタムを作成してコントロールのinメソッドをGrid描画できます。GridLinesOnRender

    using System.Windows;
    using System.Windows.Controls;
    using System.Windows.Media;

    namespace BorderGridControl
    {
        public class GridControl : Grid
        {
            #region Properties
            public bool ShowCustomGridLines
            {
                get { return (bool)GetValue(ShowCustomGridLinesProperty); }
                set { SetValue(ShowCustomGridLinesProperty, value); }
            }

            public static readonly DependencyProperty ShowCustomGridLinesProperty =
                DependencyProperty.Register("ShowCustomGridLines", typeof(bool), typeof(GridControl), new UIPropertyMetadata(false));

            
            public Brush GridLineBrush
            {
                get { return (Brush)GetValue(GridLineBrushProperty); }
                set { SetValue(GridLineBrushProperty, value); }
            }

            public static readonly DependencyProperty GridLineBrushProperty =
                DependencyProperty.Register("GridLineBrush", typeof(Brush), typeof(GridControl), new UIPropertyMetadata(Brushes.Black));

            public double GridLineThickness
            {
                get { return (double)GetValue(GridLineThicknessProperty); }
                set { SetValue(GridLineThicknessProperty, value); }
            }

            public static readonly DependencyProperty GridLineThicknessProperty =
                DependencyProperty.Register("GridLineThickness", typeof(double), typeof(GridControl), new UIPropertyMetadata(1.0));
            #endregion

            protected override void OnRender(DrawingContext dc)
            {
                if (ShowCustomGridLines)
                {
                    foreach (var rowDefinition in RowDefinitions)
                    {
                        dc.DrawLine(new Pen(GridLineBrush, GridLineThickness), new Point(0, rowDefinition.Offset), new Point(ActualWidth, rowDefinition.Offset));
                    }

                    foreach (var columnDefinition in ColumnDefinitions)
                    {
                        dc.DrawLine(new Pen(GridLineBrush, GridLineThickness), new Point(columnDefinition.Offset, 0), new Point(columnDefinition.Offset, ActualHeight));
                    }
                    dc.DrawRectangle(Brushes.Transparent, new Pen(GridLineBrush, GridLineThickness), new Rect(0, 0, ActualWidth, ActualHeight));
                }
                base.OnRender(dc);
            }
            static GridControl()
            {
                DefaultStyleKeyProperty.OverrideMetadata(typeof(GridControl), new FrameworkPropertyMetadata(typeof(GridControl)));
            }
        }
    }

私はそれを試してみましたが、うまく機能しているようです。

使用例を次に示します。

    <controls:GridControl ShowCustomGridLines="True"
                          GridLineBrush="Red"
                          GridLineThickness="1">
        <Grid.RowDefinitions>
            <RowDefinition/>
            <RowDefinition/>
            <RowDefinition/>
        </Grid.RowDefinitions>
        <Grid.ColumnDefinitions>
            <ColumnDefinition/>
            <ColumnDefinition/>
            <ColumnDefinition/>
        </Grid.ColumnDefinitions>
    </controls:GridControl>
于 2011-09-16T20:13:12.487 に答える