在C#中有一种方法来检查一个对象是否暂停? 我有一个TreeView,我需要知道它是否仍然挂起。
myTreeView.BeginUpdate(); myTreeView.SuspendLayout(); // Do Stuff. myTreeView.EndUpdate(); myTreeView.ResumeLayout();
因为我有这个代码recursion函数,我想知道如果TreeView已被暂停。
Microsoft.CSharp库中的BadImageFormatexception
System.data.OracleClient使用七位64位操作系统上的32位oracle客户端驱动程序
如何使用.NET枚举属于特定进程的所有窗口?
.NET FileInfo.LastWriteTime和FileInfo.LastAccesstime是错误的
注册热键
从害虫的答案来看,你有一个选择:
使用下面的类
public class SuspendAwareTreeView : TreeView { public readonly T RealControl; private int suspendCount; public bool IsSuspended { get { return suspendCount > 0; } } public Suspendable(T real) { this.RealControl = real; } public void SuspendLayout() { this.suspendCount++; this.RealControl.SuspendLayout(); } public void ResumeLayout() { this.RealControl.ResumeLayout(); this.suspendCount--; } }
然后使用这个类来处理需要暂停的所有内容。
显然这是行不通的,如果你把这个类传递给那些只能期待控件的东西,或者是你的控制之外的其他东西来设置它的话。
如果是这样的话,你将不得不采取各种令人愉快的解决方案:
编写一个包装TreeView的新用户控件,并将所有调用都推迟到它,但保持挂起状态。
结果的实例不再是“是一个TreeView”,这将导致问题。
维护工作可能很高。
如果由于某种原因,树视图决定暂停自己,这将打破。
新版本的运行时间不会破坏任何东西,你根本就不会毫不费力地获得新的功能。
实现一个全新的公开这个状态的TreeViewEx
结果的实例不再是“是一个TreeView”,这将导致问题。
维护工作可能很高
永远不能打破,因为你有完全的控制,可以与原来的分歧
新版本的运行时间不会破坏任何东西,如果没有大量的努力(可能违反法律/ EULA),您将无法获得新的功能。
违反封装
类型系统没有改变,其他一切都继续工作。
运行时更改的维护工作可能很高
如果运行时发生变化,应用程序将会中断
为了您的需要, 当且仅当您控制运行时版本,这完全(即受控制的企业环境)运作,以下邪恶但有效的黑客是适当的。 只要你测试任何时候你升级它可能继续努力工作。
public class ControlInvader { private static readonly System.Reflection.FieldInfo layoutSuspendCount = typeof(Control).GetField("layoutSuspendCount",System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.NonPublic); private readonly Control control; public bool IsSuspended { get { return 0 != (byte)layoutSuspendCount.GetValue(this.control); } } public Suspendable(Control control) { this.control = control; } }
把它附加到你的TreeView,然后你可以随时查看这个值。
重申这是脆弱的 ,完全不适用于底层运行时版本没有严格控制的环境,在这种情况下,您可以通过重大的努力来解决这个问题。 你会做得很好,包括一个静态的初始化程序,检查该字段是否真的存在,是否是正确的类型,如果没有,则中止。
那么,这是一个迟到的答案,但在内部,控制是跟踪计数,只会恢复在最简历语句。 那么,为什么你首先关心它,你只要确保你叫挂起,并在最后阻止它恢复:
void Recursive(Control c) { c.SuspendLayout(); try { if (existCondition) return; // do stuff Recursive(c); } finally { c.ResumeLayout(true); } }
这是有效的,因为下面是控制内部如何响应您的呼叫按以下顺序:
c.SuspendLayout() // 1st call suspends layout c.SuspendLayout() // 2nd and subsequent call only increase the count and does nothing. .... c.ResumeLayout(true) // this decrease the count to 1 and does NOT actually resumes layout. c.ResumeLayout(true) // this set the count to 0 and REALLY resumes layout.
HTH
从System.Windows.Forms.Control的SuspendLayout方法快速查看反射器显示以下内容:
public void SuspendLayout() { this.layoutSuspendCount = (byte) (this.layoutSuspendCount + 1); if (this.layoutSuspendCount == 1) { this.OnLayoutSuspended(); } }
由于它没有设置任何公共标志,并且OnLayoutSuspended()方法是内部的,所以似乎没有办法找出控件何时被挂起。
您可以使用新的Suspend和ResumeLayout方法创建树视图的子类,但是由于基本方法不是虚拟的,因此很难保证在所有情况下都会调用它们。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。