C# 获取控件的继承属性';s右向左 背景
在C# 获取控件的继承属性';s右向左 背景,c#,winforms,C#,Winforms,在WinForms应用程序控件中有一个名为RightToLeft的枚举的AmbientProperty 现在,此枚举有三个选项:Yes、No和继承 问题是,每当我需要计算出right-toleftprop'的确切值时,我就会得到Inherits选项的堆栈。 问题 是否有任何方法可以从控件的父控件或控件本身检索值,并最终得到true/false而不是一个恼人的枚举?尝试以下方法: private bool IsRightToLeft(Control c){ if(c.Right
WinForms应用程序控件中
有一个名为RightToLeft
的枚举的AmbientProperty
现在,此枚举有三个选项:Yes
、No
和继承
问题是,每当我需要计算出right-toleft
prop'的确切值时,我就会得到Inherits
选项的堆栈。
问题
是否有任何方法可以从控件的父控件或控件本身检索值,并最终得到true
/false
而不是一个恼人的枚举?尝试以下方法:
private bool IsRightToLeft(Control c){
if(c.RightToLeft == RightToLeft.Inherit){
return (c.Parent != null) ? IsRightToLeft(c.Parent) : false;
//I think if the Control has no Parent, its Default RightToLeft is Inherit.
}
else return c.RightToLeft == RightToLeft.Yes;
}
或使用扩展方法:
public static class ControlExtension {
public static bool IsRightToLeft(this Control c){
return c.RightToLeft == RightToLeft.Inherit ? (c.Parent != null ? IsRightToLeft(c.Parent) : false) : c.RightToLeft == RightToLeft.Yes;
}
}
更新
下面是另一个可能更简单的解决方案,尽管它使用了一个名为GetWindowLong
的win32函数,但整个想法是如果RightToLeft=RightToLeft.Yes
,则控件将具有WS_EX_RIGHT=0x1000
,否则RightToLeft=RightToLeft.No
(事实上,RightToLeft=RightToLeft.Inherit
意味着它可能是Yes
或No
,我通常看到的默认值是No
,意思是从左到右)
我认为这比我以前发布的要好。RightToLeft getter只返回Yes或No值,您永远不会得到Inherit值
引用MSDN:
如果将继承的值指定给RightToLeft属性,则返回的值将是父控件RightToLeft属性的设置。如果没有父控件,它将返回值no
是的,它成功了。我需要将这种递归模式融入到我的编码习惯中,谢谢。@NucS通过另一个选项查看我的更新,让您实现方法IsRightToLeft()
returningbool
。您不必检查父控件,RightToLeft属性getter可以自己执行。你可以用反射器来验证。你自己是怎么知道的?在阅读问题后进行一些搜索,还是你以前学过?知道这件事很有趣。事实上,我甚至没有尝试/测试OP所说的关于接收Inherit
值的可能性,答案也是+1,太晚了,但完全正确。然而,这个问题不是很严重。我在阅读了这个问题后与Reflector进行了核对,因为我怀疑“inherit”应该像CSS中一样工作。正如LukeSw在下面指出的,RightToLeft属性永远不会返回“inherit”。这个问题可能比你说的要多。
[DllImport("user32")]
private static extern int GetWindowLong(IntPtr hwnd, int nIndex);
public static class ControlExtension {
public static bool IsRightToLeft(this Control c){
return (GetWindowLong(c.Handle,-20) & 0x1000) != 0;//GWL_EXSTYLE = -20
}
}