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

.NET MAUI嵌套CollectionView游戏分数显示截断问题求助

.NET MAUI保龄球分数记录应用横向分数行截断问题修复

我正在开发一款C# .NET MAUI保龄球团队分数记录应用,要求支持2名及以上队员的联赛,每场比赛可根据联赛规则设置1场及以上对局(多数联赛要求3局,部分支持更多)。目前遇到的问题是:在显示球员姓名、平均分、让分后,横向展示的游戏分数行被截断,仅能看到部分内容。

问题效果

截图显示:球员姓名、平均分、让分输入框正常展示,但下方横向排列的分数输入行仅能看到前几个条目,超出屏幕宽度的部分被截断,无法查看或编辑。


相关代码

MainViewModel.cs

using CollectionView2022.Models;
namespace CollectionView2022
{
    public partial class MainViewModel : ObservableObject
    {
        [ObservableProperty]
        int rows;
        [ObservableProperty]
        int cols;
        [ObservableProperty]
        ObservableCollection<Bowler> bowlers;
        [ObservableProperty]
        List<Game> scores;
        List<string> gameNames = new List<string> { "Rick", "Bob", "Colton", "Jeff" };
        public MainViewModel()
        {
            Rows = 1;
            Cols = 1;
            Bowlers = new ObservableCollection<Bowler>();
        }
        [RelayCommand]
        private void Generate()
        {
            int dr = 0;
            int dc = 0;
            int s = 200;
            do
            {
                Bowlers.Add(new Bowler
                {
                    Average = 0,
                    Name = gameNames[dr],
                    Handicap = 0

                });
                Bowlers[dr].Scores = new List<Game>();
                do
                {
                    Bowlers[dr].Scores.Add((Game)new Game { score = s });
                    dc++;
                    s=s+10;
                } while (dc < cols);
                dc = 0;
                dr++;
            } while (dr < rows);
            
        }
        
    }
}

MainPage.xaml

<?xml version="1.0" encoding="utf-8" ?>
<ContentPage xmlns="http://schemas.microsoft.com/dotnet/2021/maui"
             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
             xmlns:model="clr-namespace:CollectionView2022.Models"
             xmlns:viewmodel="clr-namespace:CollectionView2022"
             x:DataType="viewmodel:MainViewModel"
             x:Class="CollectionView2022.MainPage">

    <ScrollView>
        <VerticalStackLayout
        Padding="30,0"
        Spacing="25">

            <HorizontalStackLayout>
                <Label
                Text="Enter Bowlers: "
                
                SemanticProperties.HeadingLevel="Level1"/>
                <Entry 
                   x:Name="EnterRows" Text="{Binding Rows}" Keyboard="Numeric" ReturnType="Next"/>
                <Label
                Text="Enter Games: "
                
                SemanticProperties.HeadingLevel="Level1"/>
                <Entry ReturnCommand="{Binding GenerateCommand}"
                x:Name="EnterCols" Text="{Binding Cols}" Keyboard="Numeric" ReturnType="Send"/>
                <Button Text="Generate" Command="{Binding GenerateCommand}"/>
                
            </HorizontalStackLayout>
            <CollectionView ItemsSource="{Binding Bowlers}" SelectionMode="Single" SelectionChanged="CollectionView_SelectionChanged">
                <CollectionView.ItemTemplate>
                    <DataTemplate x:DataType="model:Bowler">
                        <Grid>
                            <Grid.RowDefinitions>
                                <RowDefinition Height="Auto" />
                                <RowDefinition Height="Auto" />
                                <RowDefinition Height="Auto" />
                                <RowDefinition Height="Auto" />
                                <RowDefinition Height="Auto" />
                                <RowDefinition Height="Auto" />
                            </Grid.RowDefinitions>
                            <Grid.ColumnDefinitions>
                                <ColumnDefinition Width="100" />
                                <ColumnDefinition Width="Auto" />
                                <ColumnDefinition Width="Auto" />
                                <ColumnDefinition Width="Auto" />
                                <ColumnDefinition Width="Auto" />
                                <ColumnDefinition Width="Auto" />
                                <ColumnDefinition Width="Auto" />
                                <ColumnDefinition Width="Auto" />
                                <ColumnDefinition Width="Auto" />
                                <ColumnDefinition Width="Auto" />
                                <ColumnDefinition Width="Auto" />
                                <ColumnDefinition Width="Auto" />
                            </Grid.ColumnDefinitions>
                            <Entry Grid.Column="0" Text="{Binding Name}" Keyboard="Text" ReturnType="Next"/>
                            <Entry Grid.Column="1" Text="{Binding Average}" Keyboard="Numeric" ReturnType="Next"/>
                            <Entry Grid.Column="2" Text="{Binding Handicap}" Keyboard="Numeric" ReturnType="Next"/>
                            <CollectionView Grid.Row="1" Grid.ColumnSpan="8" ItemsLayout="HorizontalList" ItemsSource="{Binding Scores}">
                                <CollectionView.ItemTemplate>
                                    <DataTemplate x:DataType="model:Game">
                                        <Grid>
                                            <Grid.ColumnDefinitions>
                                                <ColumnDefinition Width="Auto" />
                                                <ColumnDefinition Width="Auto" />
                                                <ColumnDefinition Width="Auto" />
                                                <ColumnDefinition Width="Auto" />
                                                <ColumnDefinition Width="Auto" />
                                                <ColumnDefinition Width="Auto" />
                                                <ColumnDefinition Width="Auto" />
                                                <ColumnDefinition Width="Auto" />
                                                <ColumnDefinition Width="Auto" />
                                                <ColumnDefinition Width="Auto" />
                                                <ColumnDefinition Width="Auto" />
                                                <ColumnDefinition Width="Auto" />
                                            </Grid.ColumnDefinitions>
                                            
                                            <HorizontalStackLayout>
                                                <Entry Text="{Binding score}" Keyboard="Numeric" ReturnType="Next"/>
                                            </HorizontalStackLayout>

                                        </Grid>

                                    </DataTemplate>
                                </CollectionView.ItemTemplate>
                            </CollectionView>
                        </Grid>
                    </DataTemplate>
                </CollectionView.ItemTemplate>
            </CollectionView>
            
        </VerticalStackLayout>
    </ScrollView>

</ContentPage>

MainPage.xaml.cs

using CollectionView2022.Models;
namespace CollectionView2022
{
    public partial class MainPage : ContentPage
    {
        public MainPage()
        {
            InitializeComponent();
            BindingContext=new MainViewModel();
        }

        private void CollectionView_SelectionChanged(object sender, SelectionChangedEventArgs e)
        {

        }
    }
}

Game.cs(Model)

namespace CollectionView2022.Models
{
    public class Game
    {
        public int score { get; set; }
    }
}

Bowler.cs(Model)

namespace CollectionView2022.Models
{
    public class Bowler
    {
        public string Name { get; set; }
        public int Average { get; set; }
        public int Handicap { get; set; }
        public List<Game> Scores { get; set; }
    }
}

GlobalUsings.cs

global using CommunityToolkit.Mvvm.ComponentModel;
global using CommunityToolkit.Mvvm.Input;
global using System.Collections.ObjectModel;
global using System.ComponentModel;
global using System.Diagnostics;
global using System.Runtime.CompilerServices;
global using System.Text.Json;

修复方案

横向分数行被截断的核心原因是:外层ScrollView仅支持垂直滚动,内部横向CollectionView没有被包裹在支持横向滚动的容器中,超出屏幕宽度的内容无法显示。

具体修改步骤

  1. 给横向分数的CollectionView添加横向滚动容器
    将横向排列的分数CollectionView包裹在ScrollView中,并设置Orientation="Horizontal",让超出屏幕的分数项可以横向滚动查看:

    <!-- 替换原横向CollectionView代码 -->
    <ScrollView Grid.Row="1" Grid.ColumnSpan="3" Orientation="Horizontal">
        <CollectionView ItemsSource="{Binding Scores}" ItemsLayout="HorizontalList">
            <CollectionView.ItemTemplate>
                <DataTemplate x:DataType="model:Game">
                    <Entry WidthRequest="60" Margin="2,0" Text="{Binding score}" Keyboard="Numeric" ReturnType="Next"/>
                </DataTemplate>
            </CollectionView.ItemTemplate>
        </CollectionView>
    </ScrollView>
    
  2. 简化布局结构
    移除Game数据模板中冗余的Grid和HorizontalStackLayout,直接使用Entry并设置固定宽度(如WidthRequest="60"),避免布局浪费空间。

  3. 优化外层Grid列定义
    原Grid定义了过多不必要的Auto列,简化为仅保留3列对应球员信息,分数行通过ColumnSpan="3"覆盖全部宽度:

    <Grid.RowDefinitions>
        <RowDefinition Height="Auto" />
        <RowDefinition Height="Auto" />
    </Grid.RowDefinitions>
    <Grid.ColumnDefinitions>
        <ColumnDefinition Width="100" />
        <ColumnDefinition Width="80" />
        <ColumnDefinition Width="80" />
    </Grid.ColumnDefinitions>
    

额外优化建议

  • 给分数Entry设置统一宽度和内边距,保证布局整齐;
  • 添加分数列标题行,提升界面可读性;
  • 优化Generate方法的循环逻辑,避免重复初始化错误。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.20 12:35:06