我想将winform的表单的Width属性绑定到标签上的Text,这样标签的文本会在我每次鼠标移动时更新。目前,我只在单击某个表单上的某个元素但未进行连续更新时才更新(如果您在Resize处理程序中更改了文本)。怎么做这件事?
答案 0 :(得分: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();
}
就像我说的那样,它完全矫枉过正,但它确实有效。
答案 1 :(得分:1)
Resize事件是要处理的正确事件。我不确定您正在寻找什么持续更新,但如果表单更改大小,则调整事件大小会触发。我相信这还包括最小化/最大化/恢复的大小更改。这应该涵盖对表单大小的所有更改。
private void OnFormResize(object sender, EventArgs args)
{
Form frm = (Form) sender;
txtWidth.Text = frm.Size.Width.ToString();
}
答案 2 :(得分: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();
}
}
}