XAMLを使わないWPF入門35「ListViewの項目を右寄せ」

コンピュータ

数字を扱う項目を右寄せにしてみます。

・サンプルコードを起動すると「Age」項目が右寄せになっていることを確認

・項目の幅の変更にも追随

ファイル名:ListViewItemRightSide.csproj


<Project Sdk="Microsoft.NET.Sdk">

  <PropertyGroup>
    <OutputType>WinExe</OutputType>
    <TargetFramework>net9.0-windows</TargetFramework>
    <Nullable>enable</Nullable>
    <ImplicitUsings>enable</ImplicitUsings>
    <UseWPF>true</UseWPF>
  </PropertyGroup>

</Project>

ファイル名:App.cs


using System;
using System.Windows;

namespace ListViewItemRightSide;

public class App : Application
{
    [STAThread]
    public static void Main(string[] args)
    {
        var app = new App();
        app.Run();
    }

    protected override void OnStartup(StartupEventArgs e)
    {
        base.OnStartup(e);
        var win = new MainWindow();
        win.Show();
    }
}

ファイル名:AssemblyInfo.cs


using System.Windows;

[assembly:ThemeInfo(
    ResourceDictionaryLocation.None,            //where theme specific resource dictionaries are located
                                                //(used if a resource is not found in the page,
                                                // or application resource dictionaries)
    ResourceDictionaryLocation.SourceAssembly   //where the generic resource dictionary is located
                                                //(used if a resource is not found in the page,
                                                // app, or any theme specific resource dictionaries)
)]

ファイル名:MainWindow.cs


using System;
using System.Collections.ObjectModel;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;

namespace ListViewItemRightSide;

public class Person
{
    public string Name { get; set; } = "";
    public int Age { get; set; }
}

public class MainViewModel
{
    public ObservableCollection<Person> People { get; } =
        new ObservableCollection<Person>
        {
            new Person { Name = "Alice", Age = 30 },
            new Person { Name = "Bob", Age = 25 },
            new Person { Name = "Charlie", Age = 35 }
        };
}

public class MainWindow : Window
{
    public MainWindow()
    {
        Title = "NoXAML ListView Sample";
        Width = 400;
        Height = 300;

        // ViewModel作成&DataContext設定
        var vm = new MainViewModel();
        DataContext = vm;

        // ListView作成
        var listView = new ListView();
        listView.SetBinding(ItemsControl.ItemsSourceProperty,
                            new Binding("People"));

        // DataTemplate
        var dataTemplate = new DataTemplate();
        // TextBlock(Age)
        var textFactory = new FrameworkElementFactory(typeof(TextBlock));
        textFactory.SetBinding(TextBlock.TextProperty, new Binding("Age"));
        textFactory.SetValue(TextBlock.HorizontalAlignmentProperty, HorizontalAlignment.Right);

        dataTemplate.VisualTree = textFactory;

        // GridViewをListViewにセット
        var gridView = new GridView();

        // 列1: Name
        gridView.Columns.Add(new GridViewColumn
        {
            Header = "Name",
            DisplayMemberBinding = new Binding("Name")
        });

        // 列2: Age
        gridView.Columns.Add(new GridViewColumn
        {
            Header = "Age",
            //DisplayMemberBinding = new Binding("Age"),
            CellTemplate = dataTemplate,
            Width = 200,
        });

        // スタイル作成
        var style = new Style(typeof(ListViewItem));
        style.Setters.Add(new Setter(ListViewItem.HorizontalContentAlignmentProperty, HorizontalAlignment.Stretch));

        // ListViewに適用
        listView.ItemContainerStyle = style;

        listView.ItemTemplate = dataTemplate;

        listView.View = gridView;

        // WindowにListViewを配置
        Content = listView;
    }
}

コメント