30

見た目を変更したボタンがいくつかあります。私はそれらを背景とカスタム ボーダー付きのフラット ボタンとして設定したので、それらはすべてき​​れいに見え、通常のボタンとはまったく異なります (実際、現在は Office 2003 ボタンのように見えます ;-)。ボタンには 1 ピクセルの境界線があります。

ただし、ボタンが選択されると (クリックまたはタブ キーを押すなどのキーボード操作でフォーカスを取得)、ボタンの周りに同じ色の余分な境界線が突然表示されるため、2 ピクセルの境界線になります。さらに、1 ピクセルの境界線を無効にすると、ボタンはフォーカス時に 1 ピクセルの境界線を取得しません。

ネットでは、この質問は「ボタンのフォーカスを無効にするにはどうすればよいですか」のようによく聞かれますが、それは私が望んでいることではありません。フォーカスはまだ存在しているはずですが、現在のように表示されません。

助言がありますか?:-)

4

12 に答える 12

44

これはあなたが探している効果ですか?

public class NoFocusCueButton : Button
{
    protected override bool ShowFocusCues
    {
        get
        {
            return false;
        }
    }
}

このカスタム ボタン クラスは、通常のボタンと同じように使用できますが、フォーカス時に余分な四角形が表示されることはありません。

于 2008-09-29T14:16:01.347 に答える
23

迷惑な二重境界線で同じ問題が発生し、答えを探してこのスレッドに出くわしました...

これを解決した方法は、BorderSizeを 0 に設定してから、OnPaint で独自の境界線を描画することでした

*注:ボタン全体ではなく、境界線のみ

簡単な例は次のとおりです。

public class CustomButton : Button
{
    public CustomButton()
        : base()
    {
        // Prevent the button from drawing its own border
        FlatAppearance.BorderSize = 0;
        FlatStyle = System.Windows.Forms.FlatStyle.Flat;
    }

    protected override void OnPaint(PaintEventArgs e)
    {
        base.OnPaint(e);

        // Draw Border using color specified in Flat Appearance
        Pen pen = new Pen(FlatAppearance.BorderColor, 1);
        Rectangle rectangle = new Rectangle(0, 0, Size.Width - 1, Size.Height - 1);
        e.Graphics.DrawRectangle(pen, rectangle);
    }
}

私の場合、これは ToolStripButton を模倣するボタンを作成する方法であり、ボタンの上にカーソルを置いたときにのみ境界線が表示されます。

public class ToolButton : Button
{
    private bool ShowBorder { get; set; }

    public ToolButton()
        : base()
    {
        // Prevent the button from drawing its own border
        FlatAppearance.BorderSize = 0;

        // Set up a blue border and back colors for the button
        FlatAppearance.BorderColor = Color.FromArgb(51, 153, 255);
        FlatAppearance.CheckedBackColor = Color.FromArgb(153, 204, 255);
        FlatAppearance.MouseDownBackColor = Color.FromArgb(153, 204, 255);
        FlatAppearance.MouseOverBackColor = Color.FromArgb(194, 224, 255);
        FlatStyle = System.Windows.Forms.FlatStyle.Flat;

        // Set the size for the button to be the same as a ToolStripButton
        Size = new System.Drawing.Size(23, 22);
    }

    protected override void OnMouseEnter(EventArgs e)
    {
        base.OnMouseEnter(e);

        // Show the border when you hover over the button
        ShowBorder = true;
    }

    protected override void OnMouseLeave(EventArgs e)
    {
        base.OnMouseLeave(e);

        // Hide the border when you leave the button
        ShowBorder = false;
    }

    protected override void OnPaint(PaintEventArgs e)
    {
        base.OnPaint(e);

        // The DesignMode check here causes the border to always draw in the Designer
        // This makes it easier to place your button
        if (DesignMode || ShowBorder)
        {
            Pen pen = new Pen(FlatAppearance.BorderColor, 1);
            Rectangle rectangle = new Rectangle(0, 0, Size.Width - 1, Size.Height - 1);
            e.Graphics.DrawRectangle(pen, rectangle);
        }
    }



    // Prevent Text from being set on the button (since it will be an icon)
    [Browsable(false)]
    public override string Text { get { return ""; } set { base.Text = ""; } }

    [Browsable(false)]
    public override ContentAlignment TextAlign { get { return base.TextAlign; } set { base.TextAlign = value; } }
}
于 2011-01-25T21:08:24.730 に答える
19

カスタム ボタンを作成します。

public partial class CustomButton: Button
{
    public ButtonPageButton()
    {
        InitializeComponent();

        this.SetStyle(ControlStyles.Selectable, false);
    }
}

それはその迷惑な境界線を取り除きます!;-)

于 2009-12-02T11:55:57.927 に答える
6

もう 1 つのオプション (少しハックタスティックですが) は、ボタンの GotFocus イベントにイベント ハンドラーをアタッチすることです。そのイベント ハンドラで、False の値をボタンのNotifyDefault()メソッドに渡します。たとえば、次のようになります。

void myButton_GotFocus(object sender, EventArgs e)
{
  myButton.NotifyDefault(false);
}

これは毎回うまくいくと思いますが、広範囲にテストしていません。今のところ問題なく動いているので満足しています。

于 2008-12-11T20:55:05.037 に答える
2

フラット スタイルのボタンに適した別の方法があります。ボタンではなくラベルを使用します。ボタンの UI を完全に置き換えるため、ボタン コントロールとラベルのどちらを使用するかは問題ではありません。同じようにクリックを処理するだけです。

これは私にとってはうまくいきましたが、良い習慣ではありませんが、良いハックであり、ボタンに明確な名前を付けている限り(そしてソースにコメントする限り)、他のコーダーがアイデアを採用します.

ライアン

于 2008-10-08T17:32:54.533 に答える
1

追加される2番目の境界線は、Windows標準の「デフォルトボタン」境界線です。複数のボタンがあるほとんどのダイアログボックス(コントロールパネルのプロパティウィンドウなど)をタブで移動すると、元の「二重枠」ボタンが「通常」になり、フォーカスのあるボタンが「二重枠」になることに気付いたかもしれません。 「」

これは必ずしも仕事に焦点を当てているわけではなく、Enterキーを押すことによって実行されたアクションを視覚的に示しています。

私には、あなたがその内部の働きを本当に気にしていないように聞こえます。ディスプレイに2つの境界線がないようにします-完全に理解できます。内部作業は、この動作が見られる理由を説明することです。今...それを試して修正します。

私が最初に試みること-そして覚えておいてください、私はこれを検証していません-はハックです。ボタンがフォーカスを受け取ったら(それによって二重境界線を取得します)、単一の境界線をオフにします。あなたはあなたが望む効果を得るかもしれません、そしてそれはかなり簡単です。(Focusイベントにフックします。さらに良いことに、Buttonをサブクラス化し、OnFocusをオーバーライドしてから、そのサブクラスを将来のボタンに使用します。)

ただし、これにより、新しい厄介な視覚的副作用が発生する可能性があります。その意味で、そしてハッキングが最良の答えになることはめったにないので、私は他の人が言ったことを「公式に」推奨しなければなりません。ボタンをカスタムペイントします。ここのコードはやり過ぎかもしれませんが、CodeProjectのこのリンクでは、その方法について説明しています(VBリンク。翻訳が必要です)。フルオンのカスタムモードでは、その2番目の境界線を完全に取り除くことができるはずです。

于 2008-10-01T21:31:51.033 に答える
0

ボタンに独自の描画コードを実装することを検討してください。そうすれば、完全に制御できます。過去に、ボタンをカスタム ペイントし、目的に合わせてすべてのボタンの特性を実装する独自の Control 派生物を実装しましたが、ボタンのペイントをオーバーライドして自分で行うことで、すべての状態での描画方法を制御できるはずです。 、集中時を含む。

于 2008-09-29T14:05:36.473 に答える
0

確かにボタンは自分で描くことができます。状態フラグの 1 つがフォーカスされています。

したがって、フラグがフォーカスされている場合は描画イベントで、好きなようにボタンを描画します。そうでない場合は、基本メソッドに渡すだけです。

于 2008-09-29T14:01:46.077 に答える
0

テキストボックスとボタンがある場合、テキストボックス書き込みの textchange イベントでbutton1.focus();

それが動作します。

于 2009-10-15T04:47:49.253 に答える
0

スタイルでFocusVisualStyle依存関係プロパティを null に設定すると、点線の境界線がなくなります。

MSDN から:コントロールのフォーカスのスタイリング、および FocusVisualStyle

Windows Presentation Foundation (WPF) には、キーボード フォーカスを受け取ったときにコントロールの外観を変更するための 2 つの並列メカニズムが用意されています。最初のメカニズムは、コントロールに適用されるスタイルまたはテンプレート内の IsKeyboardFocused などのプロパティに対してプロパティ セッターを使用することです。2 番目のメカニズムは、 FocusVisualStyleプロパティの値として別のスタイルを提供することです。 「フォーカス ビジュアル スタイル」は、コントロールまたは他の UI 要素のビジュアル ツリーを置き換えて変更するのではなく、コントロールの上に描画する装飾用の別のビジュアル ツリーを作成します。このトピックでは、これらの各メカニズムが適切なシナリオについて説明します。

表示される余分な境界線は、コントロール テンプレートではなく、FocusVisualStyle によって定義されるため、境界線を削除するには、スタイルを削除またはオーバーライドする必要があります。

于 2008-11-18T12:56:43.247 に答える
0

非表示のボタンを作成して、別のボタンを押すたびにアクティブにすることもできます。

于 2013-01-17T15:11:44.657 に答える
-4

ボタンの Focusable プロパティを false に設定するだけで幸運に恵まれました。

<Button HorizontalAlignment="Left" Margin="0,2" 
        Command="{Binding OpenSuspendedJobCommand, Mode=OneWay}"  
        Focusable="False"
        Style="{StaticResource ActionButton}" Content="Open Job..." />
于 2010-12-02T20:40:03.350 に答える