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

Xamarin自定义ProgressBar布局调整及ProgressTo调用失效问题咨询

Xamarin 自定义进度条布局调整及ProgressTo方法不生效问题

我此前咨询过Xamarin自定义ProgressBar的相关问题,本次实现未使用Syncfusion组件,当前的实现代码如下:

<StackLayout Padding="12,0" Margin="0,0,0,35">
    <Grid HorizontalOptions="FillAndExpand" BackgroundColor="#fff" Padding="0">
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="*"/>
            <ColumnDefinition Width="*"/>
            <ColumnDefinition Width="*"/>
            <ColumnDefinition Width="*"/>
            <ColumnDefinition Width="*"/>
            <ColumnDefinition Width="*"/>
        </Grid.ColumnDefinitions>
        <!--group-->
        <Grid Grid.Row="0" Grid.Column="0" Margin="0,0,0,-2" HorizontalOptions="Center" VerticalOptions="Center">
            <Label Text="0 K" HorizontalOptions="CenterAndExpand" FontSize="12" />
        </Grid>
        <Grid Grid.Row="1" Grid.Column="0" HorizontalOptions="Center" VerticalOptions="Center">
            <Frame HasShadow="False" Padding="0" CornerRadius="30" WidthRequest="10" HeightRequest="10" BackgroundColor="Red"></Frame>
        </Grid>
        <Grid Grid.Row="2" Grid.Column="0" Margin="0,-2,0,0" HorizontalOptions="Center" VerticalOptions="Center">
            <Label Text="10%" TextColor="Red" HorizontalOptions="CenterAndExpand" FontSize="13" />
        </Grid>
        <!--end group-->
        <!--group-->
        <Grid Grid.Row="0" Grid.Column="1" Margin="0,0,0,-2" HorizontalOptions="Center" VerticalOptions="Center">
            <Label Text="10 K" HorizontalOptions="CenterAndExpand" FontSize="12" />
        </Grid>
        <Grid Grid.Row="1" Grid.Column="1" HorizontalOptions="Center" VerticalOptions="Center">
            <Frame HasShadow="False" Padding="0" CornerRadius="30" WidthRequest="10" HeightRequest="10" BackgroundColor="#ddd"></Frame>
        </Grid>
        <Grid Grid.Row="2" Grid.Column="1" Margin="0,-2,0,0" HorizontalOptions="Center" VerticalOptions="Center">
            <Label Text="11%" TextColor="Red" HorizontalOptions="CenterAndExpand" FontSize="13" />
        </Grid>
        <!--end group-->
        <!--group-->
        <Grid Grid.Row="0" Grid.Column="2" Margin="0,0,0,-2" HorizontalOptions="Center" VerticalOptions="Center">
            <Label Text="200 K" HorizontalOptions="CenterAndExpand" FontSize="12" />
        </Grid>
        <Grid Grid.Row="1" Grid.Column="2" HorizontalOptions="Center" VerticalOptions="Center">
            <Frame HasShadow="False" Padding="0" CornerRadius="30" WidthRequest="10" HeightRequest="10" BackgroundColor="#ddd"></Frame>
        </Grid>
        <Grid Grid.Row="2" Grid.Column="2" Margin="0,-2,0,0" HorizontalOptions="Center" VerticalOptions="Center">
            <Label Text="12%" TextColor="Red" HorizontalOptions="CenterAndExpand" FontSize="13" />
        </Grid>
        <!--end group-->
        <!--group-->
        <Grid Grid.Row="0" Grid.Column="3" Margin="0,0,0,-2" HorizontalOptions="Center" VerticalOptions="Center">
            <Label Text="300 K" HorizontalOptions="CenterAndExpand" FontSize="12" />
        </Grid>
        <Grid Grid.Row="1" Grid.Column="3" HorizontalOptions="Center" VerticalOptions="Center">
            <Frame HasShadow="False" Padding="0" CornerRadius="30" WidthRequest="10" HeightRequest="10" BackgroundColor="#ddd"></Frame>
        </Grid>
        <Grid Grid.Row="2" Grid.Column="3" Margin="0,-2,0,0" HorizontalOptions="Center" VerticalOptions="Center">
            <Label Text="12%" TextColor="Red" HorizontalOptions="CenterAndExpand" FontSize="13" />
        </Grid>
        <!--end group-->
        <!--group-->
        <Grid Grid.Row="0" Grid.Column="4" Margin="0,0,0,-2" HorizontalOptions="Center" VerticalOptions="Center">
            <Label Text="400 K" HorizontalOptions="CenterAndExpand" FontSize="12" />
        </Grid>
        <Grid Grid.Row="1" Grid.Column="4" HorizontalOptions="Center" VerticalOptions="Center">
            <Frame HasShadow="False" Padding="0" CornerRadius="30" WidthRequest="10" HeightRequest="10" BackgroundColor="#ddd"></Frame>
        </Grid>
        <Grid Grid.Row="2" Grid.Column="4" Margin="0,-2,0,0" HorizontalOptions="Center" VerticalOptions="Center">
            <Label Text="12%" TextColor="Red" HorizontalOptions="CenterAndExpand" FontSize="13" />
        </Grid>
        <!--end group-->
        <!--group-->
        <Grid Grid.Row="0" Grid.Column="5" Margin="0,0,0,-2" HorizontalOptions="Center" VerticalOptions="Center">
            <Label Text="500 K" HorizontalOptions="CenterAndExpand" FontSize="12" />
        </Grid>
        <Grid Grid.Row="1" Grid.Column="5" HorizontalOptions="Center" VerticalOptions="Center">
            <Frame HasShadow="False" Padding="0" CornerRadius="30" WidthRequest="10" HeightRequest="10" BackgroundColor="#ddd"></Frame>
        </Grid>
        <Grid Grid.Row="2" Grid.Column="5" Margin="0,-2,0,0" HorizontalOptions="Center" VerticalOptions="Center">
            <Label Text="12%" TextColor="Red" HorizontalOptions="CenterAndExpand" FontSize="13" />
        </Grid>
        <!--end group-->
    </Grid>

    <ProgressBar Margin="35,-37.5,35,0" ProgressColor="#ddd" HeightRequest="3" HorizontalOptions="FillAndExpand" x:Name="progressbar"/>
</StackLayout>

实现效果见下图:
实现效果图
现有两个问题需要解决:

  • 如何调整布局让ProgressBar显示在截图中圈出的红色圆点下方?
  • 在.xaml.cs文件中调用ProgressTo方法设置进度条不生效,写法如下,该如何修复?
private async void Progress()
{
    progressbar.Progress = 10000;
    float progress = 2000;
    await progressbar.ProgressTo(progress, 500, Easing.Linear);
}

解决方案

1. 调整ProgressBar位置到圆点下方

你目前用负Margin硬拉位置的方式适配性很差,直接把ProgressBar放到外层Grid的圆点所在行、跨所有列即可,修改后的布局代码如下:

<Grid Padding="12,0" Margin="0,0,0,35" BackgroundColor="#fff">
    <Grid.RowDefinitions>
        <RowDefinition Height="Auto"/>
        <RowDefinition Height="Auto"/>
        <RowDefinition Height="Auto"/>
    </Grid.RowDefinitions>
    <Grid.ColumnDefinitions>
        <ColumnDefinition Width="*"/>
        <ColumnDefinition Width="*"/>
        <ColumnDefinition Width="*"/>
        <ColumnDefinition Width="*"/>
        <ColumnDefinition Width="*"/>
        <ColumnDefinition Width="*"/>
    </Grid.ColumnDefinitions>
    <!--group 0-->
    <Label Grid.Row="0" Grid.Column="0" Margin="0,0,0,-2" HorizontalOptions="Center" FontSize="12" Text="0 K" />
    <Frame Grid.Row="1" Grid.Column="0" HasShadow="False" Padding="0" CornerRadius="30" WidthRequest="10" HeightRequest="10" BackgroundColor="Red"/>
    <Label Grid.Row="2" Grid.Column="0" Margin="0,-2,0,0" HorizontalOptions="Center" TextColor="Red" FontSize="13" Text="10%" />
    <!--group 1-->
    <Label Grid.Row="0" Grid.Column="1" Margin="0,0,0,-2" HorizontalOptions="Center" FontSize="12" Text="10 K" />
    <Frame Grid.Row="1" Grid.Column="1" HasShadow="False" Padding="0" CornerRadius="30" WidthRequest="10" HeightRequest="10" BackgroundColor="#ddd"/>
    <Label Grid.Row="2" Grid.Column="1" Margin="0,-2,0,0" HorizontalOptions="Center" TextColor="Red" FontSize="13" Text="11%" />
    <!--group 2-->
    <Label Grid.Row="0" Grid.Column="2" Margin="0,0,0,-2" HorizontalOptions="Center" FontSize="12" Text="200 K" />
    <Frame Grid.Row="1" Grid.Column="2" HasShadow="False" Padding="0" CornerRadius="30" WidthRequest="10" HeightRequest="10" BackgroundColor="#ddd"/>
    <Label Grid.Row="2" Grid.Column="2" Margin="0,-2,0,0" HorizontalOptions="Center" TextColor="Red" FontSize="13" Text="12%" />
    <!--group 3-->
    <Label Grid.Row="0" Grid.Column="3" Margin="0,0,0,-2" HorizontalOptions="Center" FontSize="12" Text="300 K" />
    <Frame Grid.Row="1" Grid.Column="3" HasShadow="False" Padding="0" CornerRadius="30" WidthRequest="10" HeightRequest="10" BackgroundColor="#ddd"/>
    <Label Grid.Row="2" Grid.Column="3" Margin="0,-2,0,0" HorizontalOptions="Center" TextColor="Red" FontSize="13" Text="12%" />
    <!--group 4-->
    <Label Grid.Row="0" Grid.Column="4" Margin="0,0,0,-2" HorizontalOptions="Center" FontSize="12" Text="400 K" />
    <Frame Grid.Row="1" Grid.Column="4" HasShadow="False" Padding="0" CornerRadius="30" WidthRequest="10" HeightRequest="10" BackgroundColor="#ddd"/>
    <Label Grid.Row="2" Grid.Column="4" Margin="0,-2,0,0" HorizontalOptions="Center" TextColor="Red" FontSize="13" Text="12%" />
    <!--group 5-->
    <Label Grid.Row="0" Grid.Column="5" Margin="0,0,0,-2" HorizontalOptions="Center" FontSize="12" Text="500 K" />
    <Frame Grid.Row="1" Grid.Column="5" HasShadow="False" Padding="0" CornerRadius="30" WidthRequest="10" HeightRequest="10" BackgroundColor="#ddd"/>
    <Label Grid.Row="2" Grid.Column="5" Margin="0,-2,0,0" HorizontalOptions="Center" TextColor="Red" FontSize="13" Text="12%" />
    <!-- ProgressBar放在圆点所在行,跨6列,自然对齐圆点下方 -->
    <ProgressBar Grid.Row="1" Grid.ColumnSpan="6" Margin="35,0,35,0" ProgressColor="#ddd" HeightRequest="3" HorizontalOptions="FillAndExpand" x:Name="progressbar"/>
</Grid>

修改后不需要负Margin调整位置,不同分辨率下也不会出现错位问题。

2. 修复ProgressTo不生效问题

Xamarin的ProgressBar的Progress属性取值范围为0到1的浮点数,你直接传入10000、2000这类远大于1的数值,系统会自动截断为1,因此看不到进度变化。需要先将业务数值换算为0-1的比例再赋值,示例代码如下:

private async void Progress()
{
    // 此处最大值对应你进度条的上限500K=500000,可根据业务需求修改
    double maxValue = 500000;
    // 初始进度换算为比例
    progressbar.Progress = 10000 / maxValue;
    // 目标进度换算为比例
    double targetProgress = 2000 / maxValue;
    await progressbar.ProgressTo(targetProgress, 500, Easing.Linear);
}

内容的提问来源于stack exchange,提问作者Chim Di Tru

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 23:15:05