2011-02-17 61 views
3

我想將一個Winform窗體的Width屬性綁定到標籤上的文本,以便標籤的文本在我做出每個鼠標移動時都會更新。目前我只在點擊某個表單上的某個元素時才更新,而不是連續更新(就像在Resize處理程序中更改文本一樣)。如何做這件事?在WPF中綁定Winform

回答

3

你可以這樣做綁定到Width屬性:

label1.DataBindings.Add(new Binding("Text", this, "Width")); 

問題存在的形式不通知的屬性已更改的框架。你最簡單最好的選擇很可能只是做了香餑餑方式:

protected override void OnResize(EventArgs e) 
{ 
    base.OnResize(e); 
    label1.Text = this.Width.ToString(); 
} 

編輯:好吧,如果你真的想使用數據綁定,這裏是一個可行的辦法(但就像是達到約頭部劃傷你的耳朵):

向表單中添加一個對象數據源,並將DataSource設置爲鍵入「System.Windows.Forms.Form」。

接下來,添加一些代碼:

public Form2() 
{ 
    InitializeComponent(); 

    this.formBindingSource.DataSource = this; 

    Binding binding = new Binding("Text", this.formBindingSource, "Size", true); 

    binding.Format += new ConvertEventHandler(binding_Format); 

    label1.DataBindings.Add(binding); 
} 

void binding_Format(object sender, ConvertEventArgs e) 
{ 
    Size size = (Size)e.Value; 
    e.Value = size.Width.ToString(); 
} 

所以就像我說的,這是完整的矯枉過正,但它的工作原理。

+0

是的,像這樣的數據綁定只是過度的imo。 +1 – 2011-02-17 17:34:52

+0

綁定將無法正常工作,因爲默認數據源更新模式爲開驗證 – 2011-02-17 17:36:18

0

你是對的,綁定到Width屬性將無法正確工作,因爲Form沒有WidthChanged事件。

您可以綁定到Size屬性,並使用格式化來格式化

public partial class Form1 : Form 
{ 
    public Form1() 
    { 
     InitializeComponent(); 

     var binding = new Binding("Text", this, "Size", false, DataSourceUpdateMode.OnPropertyChanged); 
     binding.Format += new ConvertEventHandler(binding_Format); 

     label1.DataBindings.Add(binding); 
    } 

    void binding_Format(object sender, ConvertEventArgs e) 
    { 
     if (e.Value is Size) 
     { 
      e.Value = ((Size)e.Value).Width.ToString(); 
     } 
    } 
} 
1

Resize事件是處理正確的事件。我不確定你正在尋找什麼樣的持續更新,但是如果表單改變了大小,Resize Event會觸發。我相信這還包括最小化/最大化/恢復的大小更改。這應該覆蓋對錶單大小的所有更改。

private void OnFormResize(object sender, EventArgs args) 
{ 
     Form frm = (Form) sender; 
     txtWidth.Text = frm.Size.Width.ToString(); 
}