/// <summary> /// /// </summary> /// <param name="source"></param> /// <param name="interpolation">相对于当前播放项的距离</param> /// <returns></returns> public async Task <PlaybackItem> PushToRelative(MusicUi source, int interpolation) { if (source.IsPlaying) { return(null); } if (!DbContext.PlaybackList.Any()) { await PushGroup(new[] { source }); return(null); } MediaPlaybackItem playItem; try { playItem = await source.GetPlaybackItem(); } catch (Exception) { await _manageService.RemoveMusicData(new[] { source }); return(null); } var dbPlayList = DbContext.PlaybackList.OrderBy(pi => pi.TrackId).ToList(); int trackId = (int)_playbackList.CurrentItemIndex; var dbPlayItem = await DbContext.PlaybackList.FirstOrDefaultAsync(pi => pi.MusicFileId == source.Id); if (dbPlayItem != null) { _playbackList.Items.Remove(_playbackList.Items[dbPlayItem.TrackId]); dbPlayList.Remove(dbPlayItem); } int targetId = trackId + interpolation; if (targetId < 0) { targetId = 0; } else if (targetId > dbPlayList.Count) { targetId = dbPlayList.Count; } var newItem = dbPlayItem == null ? new PlaybackItem(source.Id) : dbPlayItem; dbPlayList.Insert(targetId, newItem); SetUpTrackId(dbPlayList, targetId); DbContext.PlaybackList.UpdateRange(dbPlayList); await DbContext.SaveChangesAsync(); _playbackList.Items.Insert(targetId, playItem); return(newItem); }