You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在UWP中创建只读SpreadSheet Table并实现指定功能?

基于DataSource的可交互表格实现示例

当然有现成的实现方案!我之前在项目里刚好做过类似的需求,下面给你一个完整的WPF示例(如果是WinUI/UWP的话思路完全一致,只是控件API略有差异),涵盖你要的所有功能:

1. XAML布局部分

首先是界面代码,我们用DataGrid作为表格控件,它原生支持列排序、列宽调整,再加上双击事件触发弹窗:

<Window x:Class="DataGridDemo.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:DataGridDemo"
        mc:Ignorable="d"
        Title="DataGrid示例" Height="450" Width="800">
    <Grid>
        <!-- 核心表格控件 -->
        <DataGrid x:Name="ItemDataGrid"
                  Margin="20"
                  ItemsSource="{Binding ItemList}"
                  CanUserSortColumns="True"  <!-- 开启列排序 -->
                  CanUserResizeColumns="True" <!-- 开启列宽调整 -->
                  SelectionMode="Single"  <!-- 单选模式 -->
                  MouseDoubleClick="ItemDataGrid_MouseDoubleClick">
            <!-- 定义表格列 -->
            <DataGrid.Columns>
                <DataGridTextColumn Header="ID" Binding="{Binding Id}" Width="Auto"/>
                <DataGridTextColumn Header="名称" Binding="{Binding Name}" Width="*"/>
                <DataGridTextColumn Header="描述" Binding="{Binding Description}" Width="2*"/>
                <DataGridTextColumn Header="创建时间" Binding="{Binding CreateTime}" Width="Auto"/>
            </DataGrid.Columns>
        </DataGrid>
    </Grid>
</Window>

<!-- 独立的详情弹窗(WPF中用Window模拟,WinUI直接用ContentDialog) -->
<Window x:Class="DataGridDemo.ItemDetailDialog"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="详情弹窗" Width="400" Height="300" WindowStartupLocation="CenterOwner">
    <StackPanel Margin="20">
        <TextBlock Text="ID:" FontWeight="Bold"/>
        <TextBlock Text="{Binding Id}" Margin="0 5 0 15"/>
        <TextBlock Text="名称:" FontWeight="Bold"/>
        <TextBlock Text="{Binding Name}" Margin="0 5 0 15"/>
        <TextBlock Text="描述:" FontWeight="Bold"/>
        <TextBlock Text="{Binding Description}" Margin="0 5 0 15"/>
        <TextBlock Text="创建时间:" FontWeight="Bold"/>
        <TextBlock Text="{Binding CreateTime}" Margin="0 5 0 15"/>
        <Button Content="关闭" Width="100" HorizontalAlignment="Right" Click="Button_Click"/>
    </StackPanel>
</Window>

2. C#逻辑部分

接下来是后台代码,包括数据源定义、双击事件处理和弹窗逻辑:

using System;
using System.Collections.ObjectModel;
using System.Windows;

namespace DataGridDemo
{
    // 数据模型类
    public class ItemModel
    {
        public int Id { get; set; }
        public string Name { get; set; }
        public string Description { get; set; }
        public DateTime CreateTime { get; set; }
    }

    public partial class MainWindow : Window
    {
        // 作为DataSource的可观察集合(支持自动更新UI)
        public ObservableCollection<ItemModel> ItemList { get; set; }

        public MainWindow()
        {
            InitializeComponent();
            DataContext = this;

            // 初始化模拟数据
            ItemList = new ObservableCollection<ItemModel>
            {
                new ItemModel { Id = 1, Name = "产品A", Description = "这是测试产品A", CreateTime = new DateTime(2024, 1, 1) },
                new ItemModel { Id = 2, Name = "产品B", Description = "这是测试产品B", CreateTime = new DateTime(2024, 2, 15) },
                new ItemModel { Id = 3, Name = "产品C", Description = "这是测试产品C", CreateTime = new DateTime(2024, 3, 20) }
            };
        }

        // 双击表格行触发的事件
        private void ItemDataGrid_MouseDoubleClick(object sender, System.Windows.Input.MouseButtonEventArgs e)
        {
            // 获取选中的项
            var selectedItem = ItemDataGrid.SelectedItem as ItemModel;
            if (selectedItem != null)
            {
                // 打开详情弹窗并绑定数据
                var detailDialog = new ItemDetailDialog();
                detailDialog.DataContext = selectedItem;
                detailDialog.ShowDialog();
            }
        }
    }

    // 详情弹窗的后台代码
    public partial class ItemDetailDialog : Window
    {
        public ItemDetailDialog()
        {
            InitializeComponent();
        }

        private void Button_Click(object sender, RoutedEventArgs e)
        {
            Close();
        }
    }
}

3. 关键功能解析

  • 列排序与调整:只需要给DataGrid设置CanUserSortColumns="True"和CanUserResizeColumns="True",控件就会自动处理排序逻辑(点击列头切换升序/降序)和列宽拖拽调整。
  • 双击打开弹窗:通过MouseDoubleClick事件获取当前选中的行数据,然后将数据绑定到弹窗的DataContext,弹窗就能自动显示选中项的详情。
  • 数据源绑定:用ObservableCollection<T>作为DataSource,确保数据变更时UI能自动更新,这是WPF/WinUI里的标准做法。

如果是WinUI的话,只需要把DataGrid换成WinUI.Controls.DataGrid,弹窗用ContentDialog(直接在代码里创建并调用ShowAsync()方法),核心逻辑完全一样。

内容的提问来源于stack exchange,提问作者Bimo

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 07:13:37