2016-08-31 2 views
0

Мне нужно узнать, загружены ли мои картинки с изображениями. Я создаю их и даю им ImageLocation. Изображения ДОЛЖНЫ загружаться через некоторое время, но мне нужно проверить, загружена ли она. Я пробовал использоватьC# .NET, если изображение загружено

if(pb.ImageLocation != null){ 
Console.WriteLine("Loaded!"); 
} 

Но это показывает, что он загружен, даже если это на самом деле нет. Кроме того, у меня есть куча динамических созданных PictureBoxes:

void CreateBrick(int x,int y) 
    { 
     bricks[i] = new PictureBox(); 
     bricks[i].Name = "pb_b" + i.ToString(); 
     bricks[i].Location = new Point(y, x); 
     bricks[i].Size = new Size(60, 60); 
     bricks[i].ImageLocation = @"Images/brick_wall.jpg"; 
     pb_bg.Controls.Add(bricks[i]); 
     brick.Add(bricks[i]); 
     i++; 
    } 

И я понятия не имею, как проверить это ...

+0

Где вы проверяете, если загружены или нет эти изображения? Здесь вы динамически создаете изображения и, конечно, не загружаетесь с изображением – Steve

+0

, которое вы можете проверить во время местоположения изображения с помощью объекта строки –

+0

Я проверяю его в отдельном потоке. – Morsus

ответ

1

Проблема в коде является то, что вы не вызовите Load или LoadAsync метод.

void CreateBrick(int x,int y) 
{ 
    bricks[i] = new PictureBox(); 
    bricks[i].Name = "pb_b" + i.ToString(); 
    bricks[i].Location = new Point(y, x); 
    bricks[i].Size = new Size(60, 60); 
    // You can pass the path directly to the Load method 
    // bricks[i].ImageLocation = @"Images/brick_wall.jpg"; 
    bricks[i].Load(@"Images/brick_wall.jpg"); 
    pb_bg.Controls.Add(bricks[i]); 
    brick.Add(bricks[i]); 
    i++; 
} 

Если вы используете метод Load, то тогда изображение загружается после вызова, если вы используете LoadAsync вы можете добавить обработчик событий для события LoadComplete.

bricks[i].LoadCompleted += onLoadComplete; 
bricks[i].LoadAsync(@"Images/brick_wall.jpg"); 
.... 

private void onLoadComplete(Object sender, AsyncCompletedEventArgs e) 
{ 
    // Don't forget to check if the image has been really loaded, 
    // this event fires also in case of errors. 
    if (e.Error == null && !e.Cancelled) 
     Console.WriteLine("Image loaded"); 
    else if (e.Cancelled) 
     Console.WriteLine("Load cancelled"); 
    else 
     Console.WriteLine("Error:" + e.Error.Message); 

} 

Если вы хотите использовать подход LoadAsync вам все равно придется решать проблему, как в соответствии с полной нагрузкой конкретного изображения к соответствующей коробке изображений. Это можно решить с помощью параметра отправителя LoadAsync. Этот параметр отправителя является PictureBox, который завершил загрузку изображения.
Вы можете использовать свойство Tag и установить его в «1», чтобы пометить ваш загрузочный ящик как загруженный, и к сообщению об ошибке в случае возникновения проблем.

private void onLoadComplete(Object sender, AsyncCompletedEventArgs e) 
{ 
    PictureBox pic = sender as PictureBox; 
    // Don't forget to check if the image has been really loaded, 
    // this event fires also in case of errors. 
    if (e.Error == null && !e.Cancelled) 
    { 
     pic.Tag = "1"; 
     Console.WriteLine("Image loaded"); 
    } 
    else 
    { 
     pic.Tag = e.Error.Message; 
     Console.WriteLine("Cancelled:" + e.Error.Message); 
    } 
} 

После этого PictureBoxes в ваших кирпичей массивы имеют их свойство Tag помечена как «1» для загруженных из них и с сообщением об ошибке для тех, с ошибкой.

+0

Как это скажется при загрузке изображения? – Esko

+0

Это не может, но без него не будет загружаться вообще. – Steve

+0

Тем не менее, он не отвечает на вопрос, следовательно, это не ответ – Esko

1

Не могли бы вы попробовать использовать LoadCompleted событие PictureBox После назначения ImageLocation как способ его описан here

Вы можете убедиться, что изображения загружаются асинхронно, конечно.

pb.WaitOnLoad = false; 

Затем загрузите изображение асинхронно:

pb.LoadAsync("some.gif"); 

Для большего от StackOverflow вы можете посмотреть here и here

Назначение обработчика событий, как следующее:

pb.LoadCompleted += PictureBox1_LoadCompleted; 

Пример обработчика событий с msdn:

private void PictureBox1_LoadCompleted(Object sender, AsyncCompletedEventArgs e) { 
    System.Text.StringBuilder messageBoxCS = new System.Text.StringBuilder(); 
    messageBoxCS.AppendFormat("{0} = {1}", "Cancelled", e.Cancelled); 
    messageBoxCS.AppendLine(); 
    messageBoxCS.AppendFormat("{0} = {1}", "Error", e.Error); 
    messageBoxCS.AppendLine(); 
    messageBoxCS.AppendFormat("{0} = {1}", "UserState", e.UserState); 
    messageBoxCS.AppendLine(); 
    MessageBox.Show(messageBoxCS.ToString(), "LoadCompleted Event"); 
} 
+0

Могу ли я узнать, почему это занижено? –

+1

Это правильный ответ! +1 Может быть, добавить пример LoadComplete-события – Esko

+0

Добавлено. Спасибо, что указали это. –

0
private stattic bool CheckUplodedImage() 
{ 
    bool return = false; 
    try 
    { 
     PictureBox imageControl = new PictureBox(); 
     imageControl.Width = 60; 
     imageControl.Height = 60; 

     Bitmap image = new Bitmap("Images/brick_wall.jpg"); 
     imageControl.Image = (Image)image; 

     Controls.Add(imageControl); 
     return true; 
    } 
    catch(Exception ex) 
    { 
    return false; 
    } 
} 

может проверить его возвращения

bool isUploded = CheckUplodedImage(); 
if(isUploded) 
{ 
    \\ ...uploaded 
    \\ Perform Operation 
} 
else 
    \\ not uploaded 
Смежные вопросы