2013-08-27 4 views
3

это простейшая возможная вещь, но я не могу обновить текст в строке состояния ... Я только начал работать в C#, но не могу найти решение. во всех ответах, принятый ответ statusBar1.Text = "text"; Я сделал простое меню и добавил пункт LOAD в меню. Изображение загружено, все работает нормально, только текст состояния не обновляется ... Btw, MessageBox также отображает правый текст, который мне нужен в строке состояния. Вот мой код, и он просто не работает:Обновить строку строки состояния

private void menuLoad_Click(object sender, EventArgs e) 
    { 
     OpenFileDialog dlg = new OpenFileDialog(); 
     dlg.Title = "Load Photo"; 
     dlg.Filter = "jpg files (*.jpg)" 
     + "|*.jpg|All files (*.*)|*.*"; 
     if (dlg.ShowDialog() == DialogResult.OK) 
     { 
      try 
      { 
       statusBar1.Text = "Loading " + dlg.FileName; 
       pbxPhoto.Image = new Bitmap(dlg.OpenFile()); 
       statusBar1.Text = "Loaded " + dlg.FileName; 
       MessageBox.Show("Text = " + dlg.FileName); 
      } 
      catch (Exception ex) 
      { 
       statusBar1.Text = "Unable to load file " + dlg.FileName; 
       MessageBox.Show("Unable to load file: " + ex.Message); 
      } 
     } 
     dlg.Dispose(); 
    } 

screenshot1

+3

К не работает, вы имеете в виду строка состояния не обновляется вообще? Или вы не видите сообщение «Загрузка», но видите сообщение «Загружено»? Позднее ожидается, потому что вы поддерживаете поток пользовательского интерфейса. –

+0

Мне жаль, если я пропустил это. Текст просто остается «Готов» и не обновляется. Я поместил текст «Ready» в свойствах statusbar1 – Mlad3n

+0

@ Mlad3n Что вы видите после закрытия MessageBox. – I4V

ответ

3

Может быть, текст получает установлен, но только не покраситься, потому что ваш поток занят загрузки картинка? Вы можете попытаться заставить строку статуса недействительным и перерисовать себя:

statusBar1.Text = "Loading " + dlg.FileName; 
statusBar1.Invalidate(); 
statusBar1.Refresh();  

pbxPhoto.Image = new Bitmap(dlg.OpenFile()); 

statusBar1.Text = "Loaded " + dlg.FileName; 
statusBar1.Invalidate(); 
statusBar1.Refresh();  

MessageBox.Show("Text = " + dlg.FileName); 

На самом деле я думаю, что я бы инкапсулировать это в метод, например:

private void UpdateStatusBarText(string text) 
{ 
    statusBar1.Text = text; 
    statusBar1.Invalidate(); 
    statusBar1.Refresh();  
} 

Таким образом, ваш try блок будет выглядеть как это:

UpdateStatusBarText("Loading " + dlg.FileName); 

pbxPhoto.Image = new Bitmap(dlg.OpenFile()); 

UpdateStatusBarText("Loaded " + dlg.FileName); 
MessageBox.Show("Text = " + dlg.FileName); 

EDIT

Элемент управления StatusStrip. Добавить ToolStripStatusLabel элемент в ней, и изменить текст этого элемента управления вместо того, что из statusBar1:

private void UpdateStatusBarText(string text) 
{ 
    toolStripStatusLabel1.Text = text; 
    statusBar1.Invalidate(); 
    statusBar1.Refresh();  
} 
+0

http://postimg.org/image/vguuz5lvr/ Здесь ... Мне понравилось, что вы сказали, и ничего не изменилось ... «Готов не обновляется ...» – Mlad3n

+0

кстати, если я делаю statusBar1.BackColor = Красный цвет; то меняется цвет фона в баре ... Все работает нормально, только это текстовое обновление не хочет меняться :) – Mlad3n

+0

@ Mlad3n см. в разделе редактирования. Я думаю, вам нужно установить свойство «Text» на «ToolStripStatusLabel», а не на 'statusBar1'. –

3

Этот ответ относится к WPF, потому что этот вопрос был изначально помечены как WPF.

Как упоминалось в @MattBurland, обновления пользовательского интерфейса не происходят одновременно с выполнением. Это означает, что установка разных значений для свойства пользовательского интерфейса бессмысленна, поскольку на самом деле будет обновляться только последний. Вместо этого вам нужно запланировать сообщение в потоке пользовательского интерфейса, используя Dispatcher. Попробуйте что-то вроде этого:

private void UpdateStatus(string message) 
{ 
    Application.Current.Dispatcher.Invoke(DispatcherPriority.Normal, (Action)(() => 
    { 
     statusBar1.Text = message; 
    })); 
} 

И тогда в вашем методе:

try 
{ 
    UpdateStatus("Loading " + dlg.FileName); 
    pbxPhoto.Image = new Bitmap(dlg.OpenFile()); 
    UpdateStatus("Loaded " + dlg.FileName); 
    MessageBox.Show("Text = " + dlg.FileName); 
} 
catch (Exception ex) 
{ 
    UpdateStatus("Unable to load file " + dlg.FileName); 
    MessageBox.Show("Unable to load file: " + ex.Message); 
} 
+0

Состояние «Загрузка ...», вероятно, не будет видно, если изображение, которое я хочу загрузить, велико ... Я ожидаю увидеть только сообщение «Загружено ...» в строке состояния, и это то, что я хочу. Я не могу поместить ваш метод UpdateStatus в свой метод menuLoad_Click. я получаю много ошибок ... Разве не должна быть только одна строка кода, которая просто меняет текст строки состояния? – Mlad3n

+0

Как вы можете поместить любой метод в другой метод? Что вы имеете в виду? Добавьте метод «UpdateStatus», затем * вызовите этот метод из обработчика кликов. Какие ошибки вы получаете? – Sheridan

+0

i get Error «Имя« Диспетчер »не существует в текущем контексте» ... 'using System.Windows.Threading;' также не принимается ... – Mlad3n

Смежные вопросы