2009-08-06 8 views
3

状況:小さなボタンが必要です。テキストがいくつかあります。C#:ボタン内の端の間隔を削除する

問題:ボタンは、テキストを表示するよりも、エッジの近くに空きスペースを表示することが重要だと思われるようです。

私の人生では、そのブランクを端から取り除く方法を理解できません。どんな助けでも大歓迎です!

ありがとうございます。

-MonsterMaw

+4

WinフォームまたはWPF? – decasteljau

+4

これはASP.NETかwinFormsボタンですか? – PortageMonkey

答えて

5

あなたがWinFormsの話をしていると仮定すると、あなたはSystemに、ボタンのFlatStyleプロパティを設定することができます。

これにより、内部パディングなしに、テキストが正確に収まるようにボタンのサイズを変更できるようになります。

+0

フラットスタイル=フラットにする必要がある場合はどうすればいいですか? (私は国境の色を設定する必要があります) – aliceraunsbaek

1

ボタンのOnPaintメソッドをオーバーライドして、好きなように描画できます。私はあなたがpevent.Graphics.DrawStringを使ってテキストを使わずにボタンを描き、テキストを自分自身に描画するためにbase.OnPaintを使うことができると思いますか?

1

これが望ましいかどうかを検討してください。ユーザーはアプリケーションから何らかの標準的な振る舞いを期待しているので、ルールを非標準にするためにルールを曲げようとしているなら、それが正しい解決策でないかもしれないという事実を少なくとも考慮する必要があります。

その他のオプションには、ボタンがあなたのために実行されていない場合、メニュー/ツールバーとリンクにUIコマンドを移動することが含まれます。

1

LinkLabelはこれに適しています(全体のUIに合っていると仮定します)。 のテキストなので、枠線やパディングを心配する必要はありません。

0

ボタンのTextプロパティを空に設定できます。他のすべてが失敗した場合は、ボタンの上にラベルを置きます。

編集。ラベルの背景色を透明にすることを忘れないでください。

0

これは非常に古いトピックですが、誰かが役に立つと思うかもしれません。

以下の私の提案を参照してください。私はカスタムButtonコントロールを作成し、プライベート部分_Textを使用できるようにTextプロパティをオーバーライドし、MyBase.OnPaint(e)イベントの直前にString.Emptyを添付します。これにより、そのボタンはテキストなしの描画になります。後で古いテキストを私有財産に再割り当てし、自分自身で文字列を描きます。私はInflateRectangleを追加して、ボタンの境界線にちょうどタッチして、それを重ならないようにします。私の提案はどんなflatstyle属性でも機能します。

Here comparison of standard button and no padding button in two flatstyles: standard and flat

Imports System.ComponentModel 
Imports System.Drawing 
Imports System.Windows.Forms 

Public Class ButtonNoPadding 
    Inherits Button 

    Private _textCurrent As String 
    Private _Text As String 

    <Category("Appearance")> 
    Public Overrides Property Text() As String 
     Get 
      Return _Text 
     End Get 
     Set(ByVal value As String) 
      If value <> _Text Then 
       _Text = value 
       Invalidate() 
      End If 
     End Set 
    End Property 

    Protected Overrides Sub OnPaint(e As PaintEventArgs) 

     _textCurrent = Text 
     _Text = String.Empty 
     MyBase.OnPaint(e) 
     _Text = _textCurrent 

     Using brush = New SolidBrush(ForeColor) 
      Using stringFormat = New StringFormat() With {.Alignment = StringAlignment.Center, .LineAlignment = StringAlignment.Center} 
       e.Graphics.DrawString(Text, Font, brush, Rectangle.Inflate(ClientRectangle, -2, -2), stringFormat) 
      End Using 
     End Using 

    End Sub 

End Class 

C#バージョン:

using Microsoft.VisualBasic; 
using System; 
using System.Collections; 
using System.Collections.Generic; 
using System.Data; 
using System.Diagnostics; 
using System.ComponentModel; 
using System.Drawing; 
using System.Windows.Forms; 

public class ButtonNoPadding : Button 
{ 

    private string _textCurrent; 

    private string _Text; 
    [Category("Appearance")] 
    public override string Text { 
     get { return _Text; } 
     set { 
      if (value != _Text) { 
       _Text = value; 
       Invalidate(); 
      } 
     } 
    } 

    protected override void OnPaint(PaintEventArgs e) 
    { 
     _textCurrent = Text; 
     _Text = string.Empty; 
     base.OnPaint(e); 
     _Text = _textCurrent; 

     using (brush == new SolidBrush(ForeColor)) { 
      using (stringFormat == new StringFormat {Alignment = StringAlignment.Center,LineAlignment = StringAlignment.Center}) { 
       e.Graphics.DrawString(Text, Font, brush, Rectangle.Inflate(ClientRectangle, -2, -2), stringFormat); 
      } 
     } 

    } 

} 
関連する問題