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()
returning
bool
。您不必检查父控件,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
   }
}