ガントチャート作成日記

今日はガントチャートとツリーリストビューでそれぞれ選択行がわかるように枠線をつけたかったので、いろいろ頑張ってようやく実装できた。


ガントチャート側はGridコントロールで実装している。それぞれの行に専用のDataTemplateを切り替えるようにして交互色を設定している。土日の列の色を変えるためにもDataTemplateを設定している。Panel.Zindexを変更することで、行の上に列のテンプレートが表示されるようにしている。

選択行の枠線を変えるために背景色が透明の行を作成し、Panel.Zindexをほかの内容より大きくすることで一番上に行が表示されるようにして後はイベントを頑張って設定した。

Xaml側

        <!-- 行の背景を描画するDataTemplate -->
        <DataTemplate x:Key="RowLineTypeDataTemplate" >
            <Rectangle  Stroke="Black" StrokeThickness="0.25" Fill="Transparent"  />
            <!--StrokeDashArray="10 10" を設定すれば点線になる-->
        </DataTemplate>

        <!-- 交互行の背景を描画するDataTemplate -->
        <DataTemplate x:Key="AlternateRowLineTypeDataTemplate" >
            <!--<Rectangle Fill="#FFEFF9EC" />-->
            <Rectangle Fill="#FFF0F0F0" StrokeThickness="0.25" />
        </DataTemplate>

        <!-- 選択行の見た目を変更するためにZindexを列のZIndexより大きいものを作成 -->
        <DataTemplate x:Key="StyleRowLineDataTemplate" >
            <Rectangle Fill="Transparent" MouseEnter="rectBack_MouseEnter" MouseLeave="rectBack_MouseLeave"/>
        </DataTemplate>

Cs側

            // 行の背景色を辺くするためのタスクをインスタンス化して追加
            for (int i = 0; i < _alltask.Count; i++)
            {
                // タスクの位置を設定
                _alltask[i].Cell.RowIndex = i;

                if (i % 2 == 0)
                {
                    // 列罫線を描画するためのタスクを新たにインスタンス化して追加
                    _GanttGridCells.Add(new GanttCell(GanttCell.TemplateType.RowLine) { ZIndex = 0, ColumnIndex = 0, ColumnSpan = ColumnCount, RowIndex = i, RowSpan = 1 });
                }
                else {
                    // 列罫線を描画するためのタスクを新たにインスタンス化して追加
                    _GanttGridCells.Add(new GanttCell(GanttCell.TemplateType.AlternateRowLine) { ZIndex = 0, ColumnIndex = 0, ColumnSpan = ColumnCount, RowIndex = i, RowSpan = 1 });
                }

                // 選択行の見た目を変更するためにZindexを列のZIndexより大きいものを作成
                _GanttGridCells.Add(new GanttCell(GanttCell.TemplateType.StyleRowLine) { ZIndex = 30, ColumnIndex = 0, ColumnSpan = ColumnCount, RowIndex = i, RowSpan = 1 });

            }

            // 土日の列の背景色を変更するためのタスクを生成
            for (int i = 0; i < ColumnCount; i++)
            {
                // 土日それぞれに合わせてTemplateTypeプロパティに値を設定するとTemplateSelecterが各値によってDataTemplateのKye名を生成し、描画に利用するDataTemplateを選択する
                if (ProjectStartDay.AddDays(i).ToString("ddd") == "土")
                {
                    _GanttGridCells.Add(new GanttCell(GanttCell.TemplateType.ColumnLineBlue) { ZIndex = 10, ColumnIndex = i, ColumnSpan = 1, RowIndex = 0, RowSpan = this.RowCount });
                }
                else if (ProjectStartDay.AddDays(i).ToString("ddd") == "日")
                {
                    _GanttGridCells.Add(new GanttCell(GanttCell.TemplateType.ColumnLineOrange) { ZIndex = 10, ColumnIndex = i, ColumnSpan = 1, RowIndex = 0, RowSpan = this.RowCount });
                }
                else if (Common.Holiday(ProjectStartDay.AddDays(i)).holiday != Common.HolidayInfo.HOLIDAY.WEEKDAY)
                {
                    // 平日以外(祝日・振替休日)の場合は日と同じ色を設定
                    _GanttGridCells.Add(new GanttCell(GanttCell.TemplateType.ColumnLineOrange) { ZIndex = 10, ColumnIndex = i, ColumnSpan = 1, RowIndex = 0, RowSpan = this.RowCount });
                }
                else
                {
                    _GanttGridCells.Add(new GanttCell(GanttCell.TemplateType.ColumnLine) { ZIndex = 10, ColumnIndex = i, ColumnSpan = 1, RowIndex = 0, RowSpan = this.RowCount });
                }
            }

いずれはこの辺りをまとめて資料にしようと思うが、試行錯誤しながらだからあとで作成日記を見ながらまとめようかなーと思う。

あとは逆にTreeListView側で選択した行の枠線をガントチャート側に反映させようと思う。

0 件のコメント:

コメントを投稿

PowerShellでEdgeを自動化(インストール不要。参考:郵便追跡サービス自動操作)

1.経緯について  RPAのソフトをインストールできないので、これまでVBSでCreateObjectでブラウザの自動操作をすることがたまにあった。 ※いざというときの手札として持っているだけで安心感が段違い  見た目上IEがインストールされていなくても、CreateObject...