ガントチャート作成日記

ヘッダー部を作成するために大きく下記の内容を対応していく。

 ・大きく分けて年月部分と日付部分をセルを表現する
 ・ヘッダーを表示するためのGanttHeaderクラスを作成し、ViewModelにHeaderプロパティを追加
 ・年月部分を表現するためにユーザーコントロールを作成する
 ・日付部分を表現するためにDataTemplateを利用する
  ※ユーザーコントロールを大量に作成すると遅くなるらしいので。

①の部分はユーザーコントロールで作成した。
②の部分はDataTemplateを利用して作成した。




ちょっと困ったのが日曜日と土曜日の背景色について、ValueConverterでバインディングしている日付を渡して色を変えようと思ったが色を事前にXamlに定義したものを利用しようと思うとFindResouceが利用できないので、MultiValueConverterを利用して、自分自身を渡すことで対応した。(DayOfTheWeekBackgroundConverter.cs)

細かいのはサンプルソースを参照。

ーーーーー DayOfTheWeekBackgroundConverter.cs
       public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
        {
            DateTime b = (DateTime)values[0];
            FrameworkElement callingElement = (FrameworkElement)values[1];
            LinearGradientBrush brush = null;
            string week = b.ToString("ddd");
            if (week == "日")
            {
                brush = (LinearGradientBrush)callingElement.FindResource("OrangeGradientBrush");
            }
            else if (week == "土")
            {
                brush = (LinearGradientBrush)callingElement.FindResource("BlueGradientBrush");
            }
            else if (Common.Holiday(b).holiday != Common.HolidayInfo.HOLIDAY.WEEKDAY)
            {
                // 平日以外(祝日・振替休日)の場合は日と同じ色を設定
                brush = (LinearGradientBrush)callingElement.FindResource("OrangeGradientBrush");
            }
            else
            {
                brush = (LinearGradientBrush)callingElement.FindResource("NormalGradientBrush");
            }
            return brush;
        }
ーーーーー 

ーーーーー GanttGrid.xaml 
                            <Border x:Name="DayLabelRowBorder" BorderBrush="Silver"  BorderThickness="0.25">
                                <Border.Background>
                                    <MultiBinding Converter="{StaticResource ConverterDayOfTheWeekBackground}">
                                        <Binding Path="Date"/>
                                        <Binding RelativeSource="{RelativeSource Self}"/>
                                    </MultiBinding>
                                </Border.Background>
                                
                                <Grid>
                                    <Grid.RowDefinitions>
                                        <RowDefinition Height="*"/>
                                        <RowDefinition Height="*"/>
                                    </Grid.RowDefinitions>
                                    <TextBlock x:Name="Day" Text="{Binding Date,Mode=TwoWay,StringFormat=dd}" TextAlignment="Center"  VerticalAlignment="Center" FontFamily="MS Gothic" Grid.Row="0" Padding="0" TextOptions.TextFormattingMode="Display" TextOptions.TextRenderingMode="ClearType" />
                                    <TextBlock x:Name="DayOfWeek" Text="{Binding Date,Converter={StaticResource ConverterDayOfTheWeek}}" TextAlignment="Center"  VerticalAlignment="Center" FontFamily="MS Gothic" Grid.Row="1" Padding="0" TextOptions.TextFormattingMode="Display" TextOptions.TextRenderingMode="ClearType" />
                                </Grid>

                            </Border>
ーーーーー 


<DownLoad>
https://sites.google.com/site/mmbloguserfile/wai-bufairu/20181204_GanntChart.zip

次は、タスクを表現する部分をやろうと思う。
タスクを大量に表示してもそんなに遅くならないようにするようにしたいと思うがどこまでできるか・・・。

0 件のコメント:

コメントを投稿

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

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