3

背景

其中WinForms App Control有一个AmbientProperty名为RightToLeft.
现在这个枚举有三个选项YesNoInherits
问题是,当我需要弄清楚RightToLeft道具的确切价值时,我会得到这些Inherits选项的堆栈。

问题

有没有办法从控件的父级或控件本身检索值并以true/false而不是恼人的枚举结束?

4

2 回答 2

3

RightToLeft getter 只返回 Yes 或 No 值,你永远不会得到 Inherit 值。

引用 MSDN:

如果将 Inherit 值分配给 RightToLeft 属性,则返回的值将是父控件的 RightToLeft 属性的设置。如果没有父控件,则返回 No 值。

于 2013-12-16T11:17:40.090 回答
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;
   }
}

更新

这是另一种可能更简单的解决方案,尽管它使用了一个名为 的 win32 函数GetWindowLong,整个想法是 if RightToLeft = RightToLeft.YesControl将具有样式WS_EX_RIGHT = 0x1000,否则RightToLeft = RightToLeft.No(实际上,RightToLeft = RightToLeft.Inherit意味着它可能是Yesor No,我看到的大多数默认值是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
   }
}

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

于 2013-07-26T03:20:10.050 回答