2010年9月10日金曜日

SilverLightで困ったこと

このごろ、Java一辺倒の社内でSilverLight(つまりはMS系)の流れが出来始めています。
筆者は何でも屋状態(経験したプロジェクトでの使用言語だけ取っても、VB・VBScript(ASP)・VC・Java・.net系(C#、VB.net)…)なわけで、現在SilverLight+C#のお勉強を進めています。

勉強がてら試作している画面で困ったことがぽろぽろと出てくるのですよね。
一番困ったのが表の扱い。
表はDataGrid(System.Windows.Controls.DataGrid)というクラスを使って実現するのですが、単純な表ならそこらに転がっているサンプルで十分です。
しかし、今回やりたいことが載っているサイトが無くて四苦八苦。
何がやりたかったかと言うと、
『任意の行の背景色を変更したい』
です。
平たく言うと、重要な情報の行だけ強調表示したいってことです。

今回は、珍しく技術系ブログにふさわしい記事として実現方法を書いてみようと思います。


Premise

  • 表のDataGrid名:dataGrid1
  • やりたいこと:強調表示したい行の背景色を赤にする


まずは表の作成ですがこれは
            <data:DataGrid
                AutoGenerateColumns="False" Height="400" HorizontalAlignment="Left" Name="dataGrid1" VerticalAlignment="Top" Width="900" Background="LightYellow" AlternatingRowBackground="Azure" ItemsSource="{Binding}" LoadingRow="dataGrid1_LoadingRow">
                <data:DataGrid.RowBackground>
                    <LinearGradientBrush EndPoint="1,0.5" StartPoint="0,0.5">
                        <GradientStop Color="Azure" Offset="0" />
                        <GradientStop Color="Blue" Offset="1" />
                    </LinearGradientBrush>
                </data:DataGrid.RowBackground>
                <data:DataGrid.Columns>
                    <data:DataGridTemplateColumn Header="タイトル1">
                        <data:DataGridTemplateColumn.CellTemplate>
                            <DataTemplate>
                                <StackPanel>
                                    <TextBlock Text="{Binding Title1_1}"/>
                                    <TextBlock Text="{Binding Title1_2}"/>
                                </StackPanel>
                            </DataTemplate>
                        </data:DataGridTemplateColumn.CellTemplate>
                    </data:DataGridTemplateColumn>
                    <data:DataGridTemplateColumn Header="タイトル2">
                        <data:DataGridTemplateColumn.CellTemplate>
                            <DataTemplate>
                                <TextBlock Text="{Binding Title2_1}"/>
                            </DataTemplate>
                        </data:DataGridTemplateColumn.CellTemplate>
                    </data:DataGridTemplateColumn>
                </data:DataGrid.Columns>
            </data:DataGrid>
見ての通り、極めて単純です。サンプルがそこここに転がっているレベル。
dataGrid名とLoadingRow(行表示時に呼び出されるようなイベント)が重要なので赤字にしてみました。
ちなみに、ItemsSourceやTextBlockのTextにある{Binding...}はC#の方で行追加を行っている部分になります。
まだイマイチBindがわかっていないのですよね。使っているうちにわかるかな^^;

で、LoadingRowの処理(dataGrid1_LoadingRow)がこちら


        private Dictionary rowContainer = new Dictionary();
        private void dataGrid1_LoadingRow(object sender, DataGridRowEventArgs e)
        {
            this.rowContainer[e.Row.GetIndex()] = e.Row;
            if (newsColumnSource[e.Row.GetIndex()].Severity == strSeverity0)
            {
                this.rowContainer[e.Row.GetIndex()].Background = makeSolidColorBrush(255, 255, 0, 0);
            }
        }

処理と一緒に必要な変数(rowContainer)も載せておきました。
rowContainerに表の各行の情報を入れて、rowContainer経由で背景色の変更を行うイメージです。
makeSolidColorBrushは単純にSolidColorBrush(単色の色情報)を作っているだけです。他のやり方で色を指定してもOKですのでスルー。

とりあえず動いたというレベルで、不具合などあったら直してくださいという感じですが(確認はしていますよ、一応)これだけのことでもいろいろ遡って知識を仕入れないと実現できないのが厳しいですね。
MSの言語は1つ2つ概念を理解すると、他のものも大体同じノリでいけるので便利なのですけどね。1つ2つが大変です^^;;


※強調表示をしない行には、元々の色を設定してください。
でないと、協調表示色で表が塗りつぶされます   ナンテコッタイ○| ̄|_
元の色の設定の例です。

this.rowContainer[e.Row.GetIndex()].Background = dataGrid1.Background;

ちなみに、色指定時にRGBをランダムで設定すると・・・ 見づらいですが色が変わって面白いと思います。

0 件のコメント:

コメントを投稿