xamarin.forms - Xamarin.forms 中的导航:缓冲区空
问题描述
Page
在 Xamarin.Forms 应用程序中,我在( Page_1 )上有一个按钮,该按钮将我发送到另一个Page
( Page_2 ) 并带有语句
await Navigation.PushAsync (new Page_2 ());
在这一点上Page
,我有几个ImageButton
s在单击该语句时都将我返回到Page_1
await Navigation.PopAsync ();
这第一次有效,但是第二次按下 Page_1 上的按钮时,我转到Page_2,然后当我单击ImageButton
应用程序退出并显示错误消息时:
System.ArgumentNullException 消息 = 缓冲区不能为空。参数名称:缓冲区
我怎样才能使Navigation.NavigationStack
仍然包含Page_1?
非常感谢你的帮助。
为 Deczaloth 添加:这是第一页的部分代码:
private async void btnModifImage_Clicked(object sender, EventArgs e)
{
string imgLocation;
// affichage et choix : gallerie ou internet
imgLocation = await DisplayActionSheet("Emplacement", "Annuler", null, imageLocation);
if (imgLocation == "Gallerie")
{
// chargement image depuis gallerie
imageChanged = true;
article_nomcat = pickerCat.Title;
article_unit = pickerUnit.Title;
try
{
FileData fileData = await CrossFilePicker.Current.PickFile();
//
var filepath = fileData.FilePath;
//
if (fileData == null)
return; // user canceled file picking
newimageByte = fileData.DataArray;
resizedImageByte = await ImageResizer.ResizeImage(newimageByte, 100, 100);
if (resizedImageByte != null)
{
imageChanged = true;
var stream1 = new MemoryStream(resizedImageByte);
ImageArticle.Source = ImageSource.FromStream(() => stream1);
}
}
catch (Exception ex)
{
imageChanged = false;
}
}
else
{
App.ImageName = name.Text;
await Navigation.PushAsync(new ImageBingPage());
}
}
以及第二页 ImageBingPage 的部分代码:
private async void img1_Clicked(object sender, EventArgs e)
{
byte[] img1Byte = await DownloadImageAsync(img1Path);
App.imgByte = img3Byte;
await Navigation.PopAsync();
}
和第二页的 biginning :
protected override void OnAppearing()
{
base.OnAppearing();
SearchImage();
base.OnDisappearing();
}
public void SearchImage()
{
List<Images> imageList = new List<Images>();
SearchResult bingResult = BingImageSearch(App.ImageName);
var res = JsonConvert.DeserializeObject<ResponseModel>(bingResult.jsonResult);
for (int i = 0; i < res.value.Count; i++)
{
imageList.Add(new Images { ImagePath = res.value[i].contentUrl });
}
img1.Source = ImageSource.FromUri(new Uri(imageList[0].ImagePath));
img1Path = imageList[0].ImagePath;
img2.Source = ImageSource.FromUri(new Uri(imageList[1].ImagePath));
img2Path = imageList[1].ImagePath;
img3.Source = ImageSource.FromUri(new Uri(imageList[2].ImagePath));
img3Path = imageList[2].ImagePath;
}
static SearchResult BingImageSearch(string searchQuery)
{
var uriQuery = baseURl + "?q=" + Uri.EscapeDataString(searchQuery);
WebRequest request = HttpWebRequest.Create(uriQuery);
request.Headers["Ocp-Apim-Subscription-Key"] = APIKey;
HttpWebResponse response = (HttpWebResponse)request.GetResponseAsync().Result;
string json = new StreamReader(response.GetResponseStream()).ReadToEnd();
var searchResult = new SearchResult();
searchResult.jsonResult = json;
searchResult.relevantHeaders = new Dictionary<String, String>();
foreach (String header in response.Headers)
{
if (header.StartsWith("BingAPIs-") || header.StartsWith("X-MSEdge-"))
searchResult.relevantHeaders[header] = response.Headers[header];
}
return searchResult;
}
async Task<byte[]> DownloadImageAsync(string imageUrl)
{
try
{
using (var httpResponse = await _httpClient.GetAsync(imageUrl))
{
if (httpResponse.StatusCode == HttpStatusCode.OK)
{
return await httpResponse.Content.ReadAsByteArrayAsync();
}
else
{
//Url is Invalid
return null;
}
}
}
catch (Exception e)
{
//Handle Exception
return null;
}
}
为 Deczaloth 添加 2 :您是对的:堆栈不为空(请参见随附的两个屏幕截图)。那么问题出在哪里呢?
为 Jack 编辑:我修改了代码以简化问题:
private async void img1_Clicked(object sender, EventArgs e)
{
//byte[] img1Byte = await DownloadImageAsync(imgPath[0]);
//App.imgByte = img1Byte;
await Navigation.PopAsync();
}
private async void img2_Clicked(object sender, EventArgs e)
{
//byte[] img2Byte = await DownloadImageAsync(imgPath[1]);
//App.imgByte = img2Byte;
await Navigation.PopAsync();
}
现在我可以在 ArticleEntry 页面和 ImageBingPage 页面之间进行 3 次往返,但之后,应用程序仍然崩溃。
为 Jack 编辑:ArticleEntry 页面上有代码:
protected override async void OnAppearing()
{
base.OnAppearing();
if (App.AddArticle == true)
{
ToolbarItems.Remove(btnDelete);
}
//
_article = (Article)BindingContext;
old_article_ID = _article.ID;
old_article_name = _article.Name;
article_nomcat = _article.NomCat;
article_unit = _article.UniteMesure;
//
if (_article.ID == 0)
{
name.Focus();
}
//
if (pickerCat.Title != null & pickerCat.Title != "choisissez une catégorie")
{
_article.NomCat = pickerCat.Title;
pickerCat.TitleColor = Color.Black;
}
else
{
if (_article.NomCat != null)
{
pickerCat.Title = _article.NomCat;
pickerCat.SelectedItem = _article.NomCat;
pickerCat.TitleColor = Color.Black;
}
else
{
pickerCat.Title = "choisissez une catégorie";
pickerCat.TitleColor = Color.Gray;
}
}
//
if (pickerUnit.Title != null & pickerUnit.Title != "choisissez une unité de mesure")
{
_article.UniteMesure = pickerUnit.Title;
pickerUnit.TitleColor = Color.Black;
}
else
{
if (_article.UniteMesure != null)
{
pickerUnit.Title = _article.UniteMesure;
pickerUnit.SelectedItem = _article.UniteMesure;
pickerUnit.TitleColor = Color.Black;
}
else
{
pickerUnit.Title = "choisissez une unité de mesure";
pickerUnit.TitleColor = Color.Gray;
}
}
//
if (pickerListeAchats.Title != null & pickerListeAchats.Title != "choisissez une liste d'achats")
{
//_article.UniteMesure = pickerUnit.Title;
pickerListeAchats.TitleColor = Color.Black;
}
//
ReadAllCategorieList dbcategorie = new ReadAllCategorieList();
DB_CategorieList = dbcategorie.GetAllCategorie(); //Get all DB Categorie
// trier
DB_CategorieList_Sorted = DB_CategorieList.OrderBy(i => i.NomCat).ToList();
//
// rempliir la liste du picker Cat
string[] pickerListCat;
List<string> pkListCat = new List<string>();
foreach (var item in DB_CategorieList_Sorted)
{
string element = item.NomCat;
//pickerCat.Items.Add(element);
pkListCat.Add(element);
}
pickerListCat = pkListCat.ToArray();
pickerCat.ItemsSource = pickerListCat;
//
// rempliir la liste du picker Unit
ReadAllUnitList dbunit = new ReadAllUnitList();
DB_UnitList = dbunit.GetAllUnit();
// trier
DB_UnitList_Sorted = DB_UnitList.OrderBy(i => i.UniteMesure).ToList();
//
List<string> pickerListUnit = new List<string>();
foreach (var item in DB_UnitList_Sorted)
{
string element = item.UniteMesure;
pickerListUnit.Add(element);
}
pickerUnit.ItemsSource = pickerListUnit;
//
// remplir la liste du picker ListeAchats
ReadAllListeAchatsList dblisteachats = new ReadAllListeAchatsList();
DB_ListeAchatsList = dblisteachats.GetAllListeAchats();
// trier
DB_ListeAchatsList_Sorted = DB_ListeAchatsList.OrderBy(i => i.NomListe).ToList();
//
List<string> pickerListAchat = new List<string>();
foreach (var item in DB_ListeAchatsList_Sorted)
{
string element = item.NomListe;
pickerListAchat.Add(element);
}
pickerListeAchats.ItemsSource = pickerListAchat;
//
//
imageByte = _article.ImageArt;
//
// convertir le byte[] en bitmapimage (si != 0)
if (_article.ImageArt != null)
{
if (imageChanged)
{
var stream1 = new MemoryStream(newimageByte);
ImageArticle.Source = ImageSource.FromStream(() => stream1);
}
else
{
var stream1 = new MemoryStream(imageByte);
ImageArticle.Source = ImageSource.FromStream(() => stream1);
}
}
else
{
if (imageChanged == false)
{
imageByte = ImageDataFromResource("MemoCourses.Assets.Images.appareil_photo.png");
var stream1 = new MemoryStream(imageByte);
ImageArticle.Source = ImageSource.FromStream(() => stream1);
}
}
//
if (App.imgByte != null)
{
resizedImageByte = await ImageResizer.ResizeImage(App.imgByte, 100, 100);
if (resizedImageByte != null)
{
imageChanged = true;
var stream1 = new MemoryStream(resizedImageByte);
ImageArticle.Source = ImageSource.FromStream(() => stream1);
}
}
//
base.OnDisappearing();
App.AddArticle = false;
}
根据 Jack 的评论更改了代码
protected override async void OnAppearing()
{
base.OnAppearing();
if (App.AddArticle == true)
{
ToolbarItems.Remove(btnDelete);
}
//
_article = (Article)BindingContext;
old_article_ID = _article.ID;
old_article_name = _article.Name;
article_nomcat = _article.NomCat;
article_unit = _article.UniteMesure;
//
if (_article.ID == 0)
{
name.Focus();
}
//
if (pickerCat.Title != null & pickerCat.Title != "choisissez une catégorie")
{
_article.NomCat = pickerCat.Title;
pickerCat.TitleColor = Color.Black;
}
else
{
if (_article.NomCat != null)
{
pickerCat.Title = _article.NomCat;
pickerCat.SelectedItem = _article.NomCat;
pickerCat.TitleColor = Color.Black;
}
else
{
pickerCat.Title = "choisissez une catégorie";
pickerCat.TitleColor = Color.Gray;
}
}
//
if (pickerUnit.Title != null & pickerUnit.Title != "choisissez une unité de mesure")
{
_article.UniteMesure = pickerUnit.Title;
pickerUnit.TitleColor = Color.Black;
}
else
{
if (_article.UniteMesure != null)
{
pickerUnit.Title = _article.UniteMesure;
pickerUnit.SelectedItem = _article.UniteMesure;
pickerUnit.TitleColor = Color.Black;
}
else
{
pickerUnit.Title = "choisissez une unité de mesure";
pickerUnit.TitleColor = Color.Gray;
}
}
//
if (pickerListeAchats.Title != null & pickerListeAchats.Title != "choisissez une liste d'achats")
{
pickerListeAchats.TitleColor = Color.Black;
}
//
ReadAllCategorieList dbcategorie = new ReadAllCategorieList();
DB_CategorieList = dbcategorie.GetAllCategorie(); //Get all DB Categorie
// trier
DB_CategorieList_Sorted = DB_CategorieList.OrderBy(i => i.NomCat).ToList();
//
// rempliir la liste du picker Cat
string[] pickerListCat;
List<string> pkListCat = new List<string>();
foreach (var item in DB_CategorieList_Sorted)
{
string element = item.NomCat;
pkListCat.Add(element);
}
pickerListCat = pkListCat.ToArray();
pickerCat.ItemsSource = pickerListCat;
//
// rempliir la liste du picker Unit
ReadAllUnitList dbunit = new ReadAllUnitList();
DB_UnitList = dbunit.GetAllUnit();
// trier
DB_UnitList_Sorted = DB_UnitList.OrderBy(i => i.UniteMesure).ToList();
//
List<string> pickerListUnit = new List<string>();
foreach (var item in DB_UnitList_Sorted)
{
string element = item.UniteMesure;
pickerListUnit.Add(element);
}
pickerUnit.ItemsSource = pickerListUnit;
//
// remplir la liste du picker ListeAchats
ReadAllListeAchatsList dblisteachats = new ReadAllListeAchatsList();
DB_ListeAchatsList = dblisteachats.GetAllListeAchats();
// trier
DB_ListeAchatsList_Sorted = DB_ListeAchatsList.OrderBy(i => i.NomListe).ToList();
//
List<string> pickerListAchat = new List<string>();
foreach (var item in DB_ListeAchatsList_Sorted)
{
string element = item.NomListe;
pickerListAchat.Add(element);
}
pickerListeAchats.ItemsSource = pickerListAchat;
//
//
imageByte = _article.ImageArt;
//
// convertir le byte[] en bitmapimage (si != 0)
if (_article.ImageArt != null)
{
if (imageGallery)
{
var stream1 = new MemoryStream(resizedImageByte);
ImageArticle.Source = ImageSource.FromStream(() => stream1);
}
else
{
if (App.imgByte == null)
{
// image depuis la base SQLite
var stream1 = new MemoryStream(imageByte);
ImageArticle.Source = ImageSource.FromStream(() => stream1);
}
else
{
// image depuis internet
var stream1 = new MemoryStream(App.imgByte);
ImageArticle.Source = ImageSource.FromStream(() => stream1);
}
}
}
else
{
if (imageChanged == false)
{
// image par défaut
imageByte = ImageDataFromResource("MemoCourses.Assets.Images.appareil_photo.png");
var stream1 = new MemoryStream(imageByte);
ImageArticle.Source = ImageSource.FromStream(() => stream1);
}
}
//
if (App.imgByte != null & imageInternet == true)
{
resizedImageByte = await ImageResizer.ResizeImage(App.imgByte, 100, 100);
if (resizedImageByte != null)
{
var stream1 = new MemoryStream(resizedImageByte);
ImageArticle.Source = ImageSource.FromStream(() => stream1);
}
}
//
base.OnDisappearing();
App.AddArticle = false;
imageGallery = false;
imageInternet = false;
}
解决方案
问题不是由NavigationStack
.
1.你不应该base.OnDisappearing();
打电话OnAppearing
:
protected override void OnAppearing()
{
base.OnAppearing();
SearchImage();
//remove this line
//base.OnDisappearing();
}
2.你得到一个java.io.IOException: Cleartext HTTP traffic to aardbeienzo.com not permitted
你无权加载以http开头的url:
转到 Android 项目 --> 属性 --> Assemblyinfo.cs,添加UsesCleartextTraffic = true
:
// Add some common permissions, these can be removed if not needed
[assembly: UsesPermission(Android.Manifest.Permission.Internet)]
[assembly: UsesPermission(Android.Manifest.Permission.WriteExternalStorage)]
[assembly: Application(UsesCleartextTraffic = true)]
更新:
private async void img1_Clicked(object sender, EventArgs e)
{
byte[] img1Byte = await DownloadImageAsync(img1Path);
//App.imgByte = img3Byte;
App.imgByte = img1Byte;
await Navigation.PopAsync();
}
更新 2:
一般来说,如果你正确使用 Navigation push/pop,是不会报错的。注意 Page 的 OnAppearing 方法并检查那里的代码。
问题中的正确代码已由 更新Marcel Delhaye
。