2025/06/20

データグリッドの派生クラス

WinUI3のデータグリッドでは基本的にDataGridTextColumnを使いますが、文字の色や背景、ツールチップを追加等は派生クラスをいちいち定義するのが結局一番効率が良いのかな?例えばタイム型データマイニングだと

internal class DataGridTextColumnTimeDM : DataGridTextColumn
{
    protected override FrameworkElement GenerateElement(DataGridCell cell, object dataItem)
    {
        Border border = new Border
        {
            HorizontalAlignment = HorizontalAlignment.Stretch, // セル内で均等に広がる
            VerticalAlignment = VerticalAlignment.Stretch, // 上下も均等に広がる
            Padding = new Thickness(5) // 適度な余白
        };
        TextBlock textBlock = new TextBlock
        {
            TextAlignment = TextAlignment.Center, // テキストを中央揃え
            HorizontalAlignment = HorizontalAlignment.Center, // 左右中央揃え
            VerticalAlignment = VerticalAlignment.Center // 上下中央揃え
        };
        if (dataItem is RaceDetailInfo item)
        {
            textBlock.Text = item.TimeDM;

            // 現在のテーマを取得
            var theme = Application.Current.RequestedTheme;

            // 文字色を変更
            switch (item.TimeDMRank)
            {
                case 1:
                    border.Background = new Microsoft.UI.Xaml.Media.SolidColorBrush(SaraD64Constants.BackColor1);
                    textBlock.Foreground = new SolidColorBrush(Colors.Black);
                    break;
                case 2:
                    border.Background = new Microsoft.UI.Xaml.Media.SolidColorBrush(SaraD64Constants.BackColor2);
                    textBlock.Foreground = new SolidColorBrush(Colors.Black);
                    break;
                case 3:
                    border.Background = new Microsoft.UI.Xaml.Media.SolidColorBrush(SaraD64Constants.BackColor3);
                    textBlock.Foreground = new SolidColorBrush(Colors.Black);
                    break;
                default: // その他
                    textBlock.Foreground = new SolidColorBrush(theme == ApplicationTheme.Dark ? Colors.White : Colors.Black);
                    break;
            }
            // ツールチップ追加
            ToolTipService.SetToolTip(textBlock, item.TimeDMToolTip);
        }

        border.Child = textBlock; // Border に TextBlock を含める
        return border;
    }
}

ああ、現在のテーマチェックして一応ダークモードとライトモードで切り替えは自分でやる必要があるっぽい。まっ、テーマ的に全て色を統一してれば自動にって方法があるのかもですが、これまで色にあくまでも近い形にしたいので深く考えずに少しだけ考慮しておこうかと。ただ、実際自分はダークモードしか使わないので、一通り形になった時に念のためにライトモードは試してからリリースしなきゃだなぁっと。

まだまだ全然途中ですが、

こんな感じにしていく予定です。

ここ最近、プライベートで色々とあり、まあ、気分転換的に少しプログラミングから一旦離れ、余暇は「ダイヤのエース」を一気見しました。気晴らしのつもりがちょっと長かったorz ただ、最後まで観ないと気になるので最後は惰性で😅 75+51+52=178話で20分/話だとしても60時間弱 ちょっとしばらくはアニメはやめて映画に戻ろうかと思います。

2025/06/15

第66回宝塚記念

滅茶苦茶堅そうだけど、まあ、グランプリだしちょっとだけ参戦😉

今回のオッズマスターズも登録はしてますが、開発が途中なのでフル参戦は見送り。開発は地味に進めてますが、本当に地味です。Win UI3はめんどくさい😓

ああ、13年程度使ってきた三菱の冷蔵庫が...製氷機能がダメだ。まあ、この冷蔵庫は問題多過ぎで、買った時から気になってたけど、氷庫の裏側に氷が頻繁に落ちる。オフシーズンに氷をあまり使わないとカビが発生する。現在の三菱の冷蔵庫もこの氷が裏側に落ちるらしいので選択肢から排除。うちは元々パナで3台程度ハズレ引いたのでパナも除外してます。残るは日立か東芝か?悩む所ですが、東芝が気になるのは問い合わせ先。フリーダイヤルがあるんですが、携帯電話はナビダイヤル。以前もここに書いた気がするけど、このナビダイヤルに掛けさせる企業の姿勢が本当に疑問。こちらがかけ放題や無料通話アプリでもナビダイヤルは課金されます。なら、普通の固定電話番号を用意してくれた方がどうとでもなる。フリーダイヤルは携帯番号認識して撥ねられる。固定電話なんて既に解約済みです。時代にマッチしない企業にはあまり関わり持ちたくないんですよねぇ。

2025/06/12

Win UI3でのDataGrid定義

Windowsフォームアプリでは

var columnNames = new string[]
{
    "umaban", "bamei", "kishu", "choukyosi", "tansho", "fukusho", "bataijyu", "mark", "chaku"
};
var columnHeader = new string[]
{
    "馬番", "馬名", "騎手", "調教師", "単勝", "複勝", "馬体重", "印", "着順"
};
var columnWidth = new int[]
{
    30, 201, 88, 88, 60, 130, 60, 30, 30
};

for (int i = 0; i < columnNames.Length; i++)
{
    DataGridViewColumn tbCol = new DataGridViewTextBoxColumn();
    tbCol.Name = columnNames[i];
    tbCol.HeaderText = columnHeader[i];
    tbCol.HeaderCell.Style.Alignment = DataGridViewContentAlignment.MiddleCenter;
    tbCol.DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleCenter;
    tbCol.ReadOnly = true;
    tbCol.SortMode = DataGridViewColumnSortMode.NotSortable;

    dgv.Columns.Add(tbCol);
    dgv.Columns[columnNames[i]].Width = columnWidth[i];
}

って感じでC#で定義してたりしました。素人的にWin UI3でデータグリッド使うにはxamlで

<Grid Grid.Row="1">
    <controls:DataGrid x:Name="RaceDetailGrid"
                    AutoGenerateColumns="False" HeadersVisibility="Column"
                    CanUserResizeColumns="False" SelectionMode="Single" RowHeight="30" CanUserSortColumns="False"
                    >
    <controls:DataGrid.Columns>
        <controls:DataGridTextColumn Header="馬番" Binding="{Binding Umaban}" Width="60"/>
        <controls:DataGridTextColumn Header="馬名" Binding="{Binding Bamei}" Width="200"/>
        <controls:DataGridTextColumn Header="服" Binding="{Binding Fuku}" Width="80"/>
        <controls:DataGridTextColumn Header="騎手" Binding="{Binding Kishu}" Width="120"/>
        <controls:DataGridTextColumn Header="調教師" Binding="{Binding Chokyosi}" Width="120"/>
        <controls:DataGridTextColumn Header="単勝" Binding="{Binding Tansho}" Width="80"/>
        <controls:DataGridTextColumn Header="複勝" Binding="{Binding Fukusho}" Width="140"/>
        <controls:DataGridTextColumn Header="馬体重" Binding="{Binding Bataiju}" Width="100"/>
        <controls:DataGridTextColumn Header="印" Binding="{Binding Mark}" Width="60"/>
        <controls:DataGridTextColumn Header="着順" Binding="{Binding Chaku}" Width="80"/>
    </controls:DataGrid.Columns>
    </controls:DataGrid>
</Grid>

としてみてたのですが、今後こんなの増えてくるとってのと今回カスタム列タイプも試したのでその為にもスマートに定義が出来ればと思い、Copilotに質問ぶつけて得た方法は

public class DataGridColumnDefinition
{
    public string Header { get; set; }
    public string BindingPath { get; set; }
    public int Width { get; set; }
    public string ColumnType { get; set; } // 列の種類を文字列で管理
}

として定義用クラスを用意し、

private void DesignRaceDetailGrid(DataGrid dataGrid)
{
    var columnDefinitions = new List<DataGridColumnDefinition>
    {
        new DataGridColumnDefinition { Header = "馬番", BindingPath = "Umaban", Width = 60, ColumnType = "Text" },
        new DataGridColumnDefinition { Header = "馬名", BindingPath = "Bamei", Width = 200, ColumnType = "Text" },
        new DataGridColumnDefinition { Header = "服", BindingPath = "Fuku", Width = 80, ColumnType = "Text" },
        new DataGridColumnDefinition { Header = "騎手", BindingPath = "Kishu", Width = 120, ColumnType = "Text" },
        new DataGridColumnDefinition { Header = "調教師", BindingPath = "Chokyosi", Width = 120, ColumnType = "Text" },
        new DataGridColumnDefinition { Header = "単勝", BindingPath = "Tansho", Width = 80, ColumnType = "Text" },
        new DataGridColumnDefinition { Header = "複勝", BindingPath = "Fukusho", Width = 140, ColumnType = "Text" },
        new DataGridColumnDefinition { Header = "馬体重", BindingPath = "Bataiju", Width = 100, ColumnType = "Text" },
        new DataGridColumnDefinition { Header = "印", BindingPath = "Mark", Width = 60, ColumnType = "Text" },
        new DataGridColumnDefinition { Header = "着順", BindingPath = "Chaku", Width = 60, ColumnType = "Text" },
    };

    foreach (var column in columnDefinitions)
    {
        DataGridColumn dataGridColumn;
        switch (column.ColumnType)
        {
            case "Text":
                dataGridColumn = new DataGridTextColumn
                {
                    Header = column.Header,
                    Binding = new Binding { Path = new PropertyPath(column.BindingPath) },
                    Width = new DataGridLength(column.Width, DataGridLengthUnitType.Pixel)
                };
                break;

            default:
                    throw new InvalidOperationException($"未対応の列タイプ: {column.ColumnType}");
        }

        dataGrid.Columns.Add(dataGridColumn);
    }
}

定義しやすさとメンテしやすさと思ってしてみました。

2025/06/08

第75回安田記念

軽く狙ってみました。

山積するWin UI3版の開発ですが、面倒な部分は後から考えるとしてちょっと出来る事を
こんな感じをたたき台に進めようかと取り組んでます。

2025/06/05

Win UI3の苦悩

自分自身も期待している部分もあるのでちょっとだけ頑張ってはいるんですが、例えば、アプリの終了です。こんなのこれまでWindowsアプリだろうと、言っちゃえばDOSや他のOSなんかでも普通に終了的にすれば問題無いのに、Win UI3だと違うっぽいです。これで昨晩かなり時間を費やしました。

基本的にWin UI3なら

Application.Current.Exit(); // アプリケーションを終了

とすれば良いってCopilotとかに言われてしても、終了時にエラーが出るしまつorz まあ、そんなのはいつもの事なので、更に突っ込んだ質問ぶつけてもなかなか良い回答は得られずでしたが、結局の所

Process.GetCurrentProcess().Kill(); // アプリを強制終了

とすれば、一応エラー無しで終われる事を確認しました。が、なんでそんな事に時間費やすんだろうって疑問はねぇ^^; まあ、なにやらリソースが解放されてないのがって事ではって話だが、そんなの勝手に処理しろよってね。でまあ、

こんな感じには進んでます。ただ、こんなのは本来サクッとな部分で、この後のレース情報の表示をどんなに再現出来るかなんかがカギですね😔

2025/06/01

第92回東京優駿(日本ダービー)

 あまり荒れる事がないレースって印象ではありますが

先週かすったので今週はかすりもしない予感😓