2013-08-16 119 views
0

我需要更改進程中的WPF標籤內容, 我試過但沒有實時更改內容。 我在哪裏做錯了?更新方法中的標籤內容

事件來電者:

private void connect_button_MouseDown(object sender, MouseButtonEventArgs e) 
{ 
    Mouse.OverrideCursor = Cursors.Wait; 
    labelStstusUpdate("Connecting.."); // Status changer 
    config = new Configuration(); 
    bool status = config.connectViaUSB(); 
    Mouse.OverrideCursor = null; 
    if (!status) 
    { 
     labelStstusUpdate("Disconnected");// Status changer 
    } 
    else 
    { 
     labelStstusUpdate("Connected");// Status changer 
    } 
} 

狀態轉換方法:

private void labelStstusUpdate(string message) 
{ 
    Dispatcher.BeginInvoke(DispatcherPriority.Background, (SendOrPostCallback)delegate 
    { 
     available_amount_label.Content = message; 
    }, null); 
} 
+0

找到一個解決方法的代碼,我想你應該閱讀有關數據綁定和MVVM一些文章。這不是你應該處理數據的方式。 – Zwirbelbart

+0

你爲什麼使用Dispatcher.BeginInvoke?您應該只在從非UI線程更新標籤時執行此操作。 –

+0

我相信你的方法執行很長('connectViaUSB')並因此阻塞了WPF UI線程(「MouseDown」) - 你應該在一個單獨的線程中執行此操作,然後從該線程內調用labelStatusUpdate。 – Sebastian

回答

1

你不能這樣做,在WPF - 數據綁定是完全不同的。 基本上,您必須將窗口的Datacontext設置爲您的類,然後將Label綁定到您的類上的屬性。

這看起來像:

public class MyWindow() 
{ 
    public string Labeltext{ get; set; } 

    private void labelStstusUpdate(string message) 
    { 
     this.Labeltext = message 
     this.NotifyOfPropertyChange(() => this.Labeltext); 
    } 
} 

當你調用notify方法,WPF會注意到的變化和更新的標籤。

作爲提示:使用像Caliburn.Micro這樣的mvvm框架進行WPF設計,它可以減少錯誤的數量並簡化開發過程。

+0

你「不能」那樣做?這不是真的。他不應該這樣做,但他可以。 –

+0

@MarkGreen稱之爲「教育無法做到這一點」 - 當然你*可以*做到這一點。但這就像學習一種複雜的技能,比如建造汽車一樣。起初:有很多「你不能這樣做」,幾年後,你發現你可以做到,但有90%的時間不應該這樣做,因爲不好的事情發生。 所以,最好先說「你不能那樣做」--- –

1

這是我最近的應用中,我們正在改變在運行時嘗試標籤的價值,從這個

public partial class MainWindow : Window 
{ 
    int Value=0; 
    private delegate void UpdateMyLabel(System.Windows.DependencyProperty dp, Object value); 

    private void Processmerge() 
    { 
    UpdateMyLabel updateLabelDelegate = new UpdateMyLabel(_Mylabel.SetValue); 

    foreach (var item in Collections) 
    { 
      string _Mylabel= "Process completed..." + Value.ToString() + " %"; 
      Dispatcher.Invoke(updateLabelDelegate, System.Windows.Threading.DispatcherPriority.Background, new object[] { System.Windows.Controls.Label.ContentProperty, _Mylabel}); 

     Value++; 
    } 
    } 
} 


}