У меня есть хак, чтобы показать изображение, движущееся с индикатором выполнения. Работает отлично, кроме обновления. Индикатор выполнения обновляется, но ширина столбца не определяется.
, т.е. если прогресс равен 50%, тогда я делаю пустой столбец 1 шириной 50%, а столбец 2 - это изображение. Работает на нагрузке, работает на ручном refre sh, но на таймере перемещается только индикатор выполнения. В общем списке потенциально может быть несколько элементов с одинаковой идеей индикатора выполнения, но разными значениями.
<Grid VerticalOptions="CenterAndExpand" Margin="0, -20, -20, -20" ColumnSpacing="-10" RowSpacing="0" Padding="0" >
<Grid.ColumnDefinitions>
<ColumnDefinition Width="{Binding progressPrecent}"/>
<ColumnDefinition Width="{Binding progressPercentRemainder}"/>
</Grid.ColumnDefinitions>
<Grid.Triggers>
<DataTrigger TargetType="Grid" Binding="{Binding progress}" Value="0">
<Setter Property="IsVisible" Value="False"/>
</DataTrigger>
</Grid.Triggers>
<Label Grid.Column="0"/>
<Image Grid.Column="1" HorizontalOptions="StartAndExpand" Scale=".7" Source="bus.png"/>
</Grid>
<ProgressBar x:Name="pb_TodayRun" Margin="0,0" Progress="{Binding progress}" ProgressColor="{StaticResource Teal}">
<ProgressBar.Triggers>
<DataTrigger TargetType="ProgressBar" Binding="{Binding progress}" Value="0">
<Setter Property="IsVisible" Value="False"/>
</DataTrigger>
</ProgressBar.Triggers>
</ProgressBar>
Код позади:
protected override void OnAppearing()
{
base.OnAppearing();
isShown = true;
Device.StartTimer(TimeSpan.FromSeconds(60/*viewModel.AutoRefreshTime*/), () =>
{
if (isShown)
{
UpdateProgress(false);
ForceLayout();
return true;
}
else
return false;
});
}
view Модель:
public ObservableCollection<TodayCell> Items { get; set; }
...
public async Task<List<TodayCell>> UpdateProgress(bool allowCached)
{
List<TodayCell.Run> temp = new List<TodayCell.Run>();
....
temp.Add(new TodayCell.Run()
{
progress = progress,
progressPrecent = new GridLength(progressPercent, GridUnitType.Star),
progressPercentRemainder = new GridLength((100-progressPercent), GridUnitType.Star),
});
Он загружается нормально, каждую минуту движется индикатор выполнения, а ширина изображения / столбца - нет, хотя отладчик показывает, что число увеличивается.
Как я могу сделать это правильно?
Edit, вот где обновляются элементы:
for (int x=0; x<=Items.Count();x++)
{
if (Items[x] is TodayCell.Run)
{
var run = (TodayCell.Run)Items[x];
var updatedRun = list.FirstOrDefault(u => u.StudentStopId == run.StudentStopId);
if (updatedRun == null)
Items.Remove(Items[x]);
else
Items[x] = updatedRun;
}
}
EDIT2: Это работает, если я использую другой подход / переменную. Измените ширину столбца на auto, затем, если я установлю пустую метку WidthRequest 1-го столбца в пикселях (переведите% с помощью Application.Current.MainPage.Width), это обновит и переместит изображение вдоль индикатора выполнения. Ширина столбца не будет обновляться, но метка widthRequest будет обновляться.