Tag: winforms

为什么在UI线程上输入锁定会触发OnPaint事件?

我遇到了一些我根本不理解的东西。 在我的应用程序中,我有几个线程都将项添加(和删除)到共享集合(使用共享锁)。 UI线程使用计时器,并在每个tick上使用集合来更新其UI。 由于我们不希望UI线程长时间保持锁定并阻止其他线程,我们这样做的方式是,首先我们获取锁,我们复制集合,然后释放锁,然后在我们的副本上工作。 代码如下所示: public void GUIRefresh() { ///… List tmpList; lock (Locker) { tmpList = SharedList.ToList(); } // Update the datagrid using the tmp list. } 虽然它工作正常,但我们注意到应用程序有时会出现速度减慢,当我们设法捕获堆栈跟踪时,我们看到了: …. at System.Windows.Forms.DataGrid.OnPaint(PaintEventArgs pe) at MyDataGrid.OnPaint(PaintEventArgs pe) at System.Windows.Forms.Control.PaintWithErrorHandling(PaintEventArgs e, Int16 layer, Boolean disposeEventArgs) at System.Windows.Forms.Control.WmPaint(Message& m) at System.Windows.Forms.Control.WndProc(Message& m) at System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m) at System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m) […]

在Windows照片查看器中打开图像

如何在C#app中打开Windows Photo Viewer中的.jpg图像? 不像这段代码那样在app里面, FileStream stream = new FileStream(“test.png”, FileMode.Open, FileAccess.Read); pictureBox1.Image = Image.FromStream(stream); stream.Close();

如何在列表框中上下移动项目?

我有一个listBox1对象,它包含一些项目。 我有一个按钮可以向上移动所选项目,另一个按钮可以向下移动所选项目。 两个按钮的代码应该是什么?

向TextBox添加新的数据行

我正在做一个聊天客户端,目前我有一个按钮,可以在点击时将数据显示到多行文本框。 这是将数据添加到多行文本框的唯一方法吗? 我觉得这是非常低效的,因为如果谈话变得非常长,那么字符串也会变得非常长。 private void button1_Click(object sender, EventArgs e) { string sent = chatBox.Text; displayBox.Text += sent + “\r\n”; }

如何检测项是否添加到ListBox(或CheckedListBox)控件

这似乎是一个基本上简单的问题。 我有一个带有列表框的WinForms对话框。 此控件不是通过数据绑定填充,而是通过调用填充 listBox.Items.Add (obj); 这个调用可能是从各个地方异步进行的,我想挂钩列表框并观察其数据成员的变化,以便我可以执行其他UI更改(例如启用或禁用与列表框交互的控件)关于列表中的项目数)。 不幸的是,除非我完全无能为力,否则似乎没有一个事件或虚拟方法可以被钩住来检测这个。 我可以挂钩选择更改和(对于CheckedListBox)我可以挂钩检查状态更改。 但不是对基础数据集的更改。 我知道这在Win32中是可能的(有一个窗口消息)。 我错过了什么? [西蒙编辑] 解 我被指向正确的解决方案(我已经标记为已接受的答案),它将覆盖ListBox的WndProc方法并手动处理列表框消息。 这是我解决(并且有效)的解决方案。 可以对其进行修改以在事件中提供更多详细信息,或将消息拆分为单独的事件,但是对于我的需求,这已足够。 using System; using System.Windows.Forms; public class CheckedListBoxEx : CheckedListBox { public CheckedListBoxEx() { } private const int LB_ADDSTRING = 0x180; private const int LB_INSERTSTRING = 0x181; private const int LB_DELETESTRING = 0x182; private const int LB_RESETCONTENT = 0x184; protected […]

有没有在TreeView.Nodes集合中搜索TreeNode.Text字段的方法?

像这样: TreeNode[] treeNodes = treeView.Nodes.Find(searchString, true); 但我希望它在text字段而不是name字段中搜索。

是否可以在.Net 3.5中进行通用控制?

我声明了以下Generic usercontrol: public partial class MessageBase : UserControl { protected T myEntry; public MessageBase() { InitializeComponent(); } public MessageBase(T newEntry) { InitializeComponent(); myEntry = newEntry; } } } 但编译器不允许我这样做: public partial class MessageControl : MessageBase { public MessageControl() { InitializeComponent(); } } 如何在C#中创建通用用户控件?

使用F1帮助(CHM格式)使用WPF

我已经在WPF应用程序上工作了一段时间,现在是时候将CHM格式的帮助文档附加到它上面了。 可惜! HelpProvider是在Winforms中显示CHM文件的标准方法,它已经神奇地消失了,并且在WPF中没有对应物。 我一直在尝试使用WindowsFormsHost来生成一个新的控件,所以我可以实际显示帮助,但实质上它只是抓住整个UI的控制权。 更多细节:我有一个我想要的菜单项,当点击时,打开CHM文件。 首先我设置了WindowsFormsHost …… host = new System.Windows.Forms.Integration.WindowsFormsHost(); helpForm = new System.Windows.Forms.Control(); host.Child = helpForm; host.Visibility = System.Windows.Visibility.Hidden; this.grid1.Children.Add(host); hp = new System.Windows.Forms.HelpProvider(); hp.HelpNamespace = “Somehelpfile.chm”; hp.SetHelpNavigator(helpForm, System.Windows.Forms.HelpNavigator.TableOfContents); 然后我说,瞧,揭示自己。 private void Help_Click(object sender, RoutedEventArgs e) { host.Visibility = Visibility.Visible; helpForm.Show(); hp.SetShowHelp(helpForm, true); } 我不确定从哪里开始。 当我显示helpForm时,它会模糊/覆盖现有的UI,我得到的是一个灰色的空WPF窗口,没有帮助文件。 任何接受者?

.net中的Tag属性有什么用处

我注意到带控件的Tag属性。 是否可以使用它来引用我的自定义对象,或者我应该远离它,因为它需要装箱和拆箱,这被提到是不安全的并且不推荐。 TreeNode tn = new TreeNode (); CustClass o = new CustClass() o.number = 123; tn.Tag = o; class CustClass { public int number {get; set;} }

如何在Windows窗体中创建表单模式?

我正在尝试创建一个子表单,帮助用户输入父表单中字段的数据。 我希望这个子窗体是模态的,但是我需要做什么才能使这个窗体模态化? 我需要使用不同类型的物品吗?