获取Control的RightToLeft的继承属性

时间:2013-07-26 03:15:38

标签: c# winforms

背景

WinForms App Control中,有一个名为AmbientProperty的枚举RightToLeft 现在,这个枚举有三个选项:YesNoInherits 问题是,当我需要弄清楚RightToLeft prop'的确切值时,我正在使用Inherits选项进行堆叠。

问题

有没有办法从控件的父级或控件本身检索值,最终得到true / false而不是恼人的枚举?

2 个答案:

答案 0 :(得分:3)

RightToLeft getter仅返回Yes或No值,您将永远不会获得Inherit值。

来自MSDN:

  

如果为RightToLeft属性指定Inherit值,则返回的值将是父控件的RightToLeft属性的设置。如果没有父控件,则返回值No。

答案 1 :(得分:2)

试试这个:

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.YesControl将具有样式WS_EX_RIGHT = 0x1000 ,否则RightToLeft = RightToLeft.No(事实上,RightToLeft = RightToLeft.Inherit表示它可能是YesNo,我看到的默认值是No - 意思是从左到右)。

[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
   }
}

我认为这比我之前发布的更好。 :)