正在获取控件的继承属性';s从右到左

本文关键字:从右到左 属性 继承 获取 控件 | 更新日期: 2023-09-27 18:25:10

背景

WinForms App Control中,存在一个名为RightToLeft的枚举的AmbientProperty
现在这个枚举有三个选项:YesNoInherits
问题是,当我需要计算出RightToLeft道具的确切值时,我会得到带有Inherits选项的堆栈

问题

是否有任何方法可以从控件的父级或控件本身检索值,并以true/false而不是烦人的枚举结束?

正在获取控件的继承属性';s从右到左

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

MSDN报价:

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

试试这个:

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

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