3

バックグラウンド

という列挙型の がWinForms App Controlあります。現在、この列挙型には、および の 3 つのオプションがあります。問題は、小道具の 正確な値を把握する必要があるときはいつでも、オプションでスタックを取得していることです。AmbientPropertyRightToLeft
YesNoInherits
RightToLeftInherits

質問

コントロールの親またはコントロール自体から値を取得し、煩わしい列挙ではなくtrue/で終わる方法はありますか?false

4

2 に答える 2

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.NoRightToLeft = RightToLeft.InheritYesNoNo

[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 に答える