2017-02-12 8 views
0

Windows 10のListViewとまったく同じような境界線を描画しようとしています。私はこれをやっているのは、Fixed3Dが沈んで見え、FixedSingleが前述の境界線と異なって見えるからです。パディング付きの子のみで塗りつぶされたカスタムパネル

拡大鏡では、Windows 10の境界線が2ピクセル幅であることがわかりました。だから、私の考えは、境界線がなく、クライアント領域に2ピクセル幅の長方形を描画し、境界線がnoneに設定された矩形の内側に収まるカスタムパネルを作成することでした。私は次のことを試しましたが、デザイナーとうまく動作せず、まったく動作しません。

どうしたのですか?

class CustomBorder:Panel 
{ 
    protected override void OnControlAdded(ControlEventArgs e) 
    { 
     if (Controls.Count == 2) 
     { 
      Controls.Remove(e.Control); 
      return; 
     } 

     base.OnControlAdded(e); 
    } 

    protected override void OnLayout(LayoutEventArgs levent) 
    { 
     var child = levent.AffectedControl; 
     if (levent.AffectedProperty == "Bounds") 
     { 
      FillChild(child); 
     } 

     base.OnLayout(levent); 
    } 

    void FillChild(Control child) 
    { 
     const int padding = 2; 
     var childSize = new Size(Bounds.Width - padding * 2, Bounds.Height - padding * 2); 

     child.SetBounds(padding, padding, childSize.Width, childSize.Height); 
    } 
} 
+0

私はあなたのロジックに従っていませんが、カスタムパネルにListViewのような境界線を設定したい場合は、[CreateParams Property](https://referencesource.microsoft.com/# System.Windows.Forms/winforms/Managed/System/WinForms/ListView.cs、9cdcd5b83231f700、references)をListViewから削除し、変更して目的の効果を作成します。 – TnTinMn

答えて

0

AffectedControlの説明は、「変更の影響を受ける子コントロールを取得する」です。しかし、奇妙なことに、それは実際にパネルそのものでした。そこで以下のように変更しました。

protected override void OnLayout(LayoutEventArgs levent) 
{ 
    if (levent.AffectedProperty == "Bounds") 
    { 
     if(HasChildren) 
      FillChild(Controls[0]); 
    } 

    base.OnLayout(levent); 
} 

それは動作しますが、それは実際には2つのコントロール、ネイティブの境界線があるようではないですおそらくので、パネルのサイズを変更する際、いくつかのちらつきがあります。

関連する問題