it-swarm.com.de

Wie man Fokusart auf einem Knopf in C # einstellt/ändert/entfernt?

Ich habe ein paar Schaltflächen, deren Aussehen ich geändert habe. Ich habe sie als flache Schaltflächen mit Hintergrund und benutzerdefiniertem Rand festgelegt, sodass sie alle hübsch und nicht mehr wie normale Schaltflächen aussehen (tatsächlich sehen sie jetzt wie Office 2003-Schaltflächen aus ;-). Die Schaltflächen haben einen Rand von einem Pixel.

Wenn die Schaltfläche ausgewählt wird (der Fokus wird entweder durch Klicken oder durch Drücken der Tabulatortaste auf die Schaltfläche gelegt), erhält die Schaltfläche plötzlich einen zusätzlichen Rand derselben Farbe, sodass ein Rand von zwei Pixeln entsteht. Wenn ich den Ein-Pixel-Rand deaktiviere, erhält die Schaltfläche außerdem keinen Ein-Pixel-Rand im Fokus.

Im Netz wird diese Frage häufig gestellt wie "Wie kann ich den Fokus auf einen Button deaktivieren?", Aber das ist nicht das, was ich möchte: Der Fokus sollte weiterhin existieren , nur nicht anzeigen wie er ist jetzt.

Irgendwelche Vorschläge? :-)

22
pbean

Ist das der Effekt, nach dem Sie suchen?

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

Sie können diese benutzerdefinierte Schaltflächenklasse wie eine normale Schaltfläche verwenden, aber Sie erhalten nicht ein zusätzliches Rechteck für den Fokus.

37
Michael L Perry

Ich hatte das gleiche Problem mit dem nervigen doppelten Rand und stolperte in diesem Thread nach einer Antwort ...

Ich habe das Problem gelöst, indem Sie BorderSize auf 0 setzen und dann meinen eigenen Rand in OnPaint zeichnen.

* Hinweis: Nicht die gesamte Schaltfläche, nur der Rand

Ein einfaches Beispiel wäre:

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

In meinem Fall habe ich auf diese Weise eine Schaltfläche erstellt, die einen ToolStripButton nachahmt, wobei der Rand nur sichtbar ist, wenn Sie mit der Maus über die Schaltfläche fahren:

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; } }
}
21
Josh Stribling

Erstellen Sie eine benutzerdefinierte Schaltfläche:

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

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

Das wird diese nervige Grenze loswerden! ;-)

14
Marcus Rex

Eine weitere Option (wenn auch etwas hacktastisch) besteht darin, einen Event-Handler an das GotFocus-Ereignis der Schaltfläche anzuhängen. Übergeben Sie in diesem Event-Handler einen Wert von False an die NotifyDefault()-Methode der Schaltfläche. So zum Beispiel:

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

Ich gehe davon aus, dass dies jedes Mal funktionieren wird, aber ich habe es nicht ausgiebig getestet. Es funktioniert jetzt für mich, also bin ich damit zufrieden.

6
Blake

Es gibt einen anderen Weg, der für flache Tasten gut geeignet ist. Verwenden Sie keine Knöpfe, sondern Beschriftungen. Da Sie die Benutzeroberfläche für die Schaltfläche vollständig ersetzen, ist es unerheblich, ob Sie ein Button-Steuerelement oder eine Beschriftung verwenden. Behandeln Sie den Klick einfach auf dieselbe Weise.

Dies funktionierte für mich, obwohl es keine gute Übung ist, es ist ein guter Hack und solange Sie den Button nennen (und die Quelle kommentieren), werden andere Programmierer die Idee aufgreifen.

Ryan

2
Ryan O'Neill

Der zweite Rahmen, der hinzugefügt wird, ist der Windows-Standardrand "Standardschaltfläche". Möglicherweise ist Ihnen aufgefallen, dass beim Durchblättern der meisten Dialogfelder mit mehreren Schaltflächen (z. B. eines der Eigenschaftenfenster der Systemsteuerung) die ursprüngliche Schaltfläche mit dem doppelten Rand "normal" wird und die Schaltfläche mit dem Fokus "den doppelten Rand". "

Dies ist nicht unbedingt ein Fokus bei der Arbeit, sondern eher ein visueller Hinweis auf die durch Drücken der Eingabetaste durchgeführte Aktion. 

Für mich hört sich das so an, als ob Sie sich nicht wirklich um das interne Arbeiten kümmern. Sie möchten, dass die Anzeige nicht zwei Ränder hat - absolut verständlich. Die interne Arbeit soll erklären, warum Sie dieses Verhalten sehen. Jetzt ... um es zu versuchen und zu reparieren.

Das erste, was ich versuchen würde - und im Hinterkopf, ich habe das nicht bestätigt - ist ein Hack. Wenn eine Schaltfläche den Fokus erhält (wodurch die doppelte Umrandung erhalten wird), deaktivieren Sie die einzelne Umrandung. Sie können den gewünschten Effekt erzielen, und das ist ziemlich einfach. (Haken Sie sich in das Focus-Ereignis ein. Noch besser: Subclass Button und OnFocus überschreiben, dann verwenden Sie diese Unterklasse für Ihre zukünftigen Buttons.)

Dies kann jedoch zu neuen, unangenehmen visuellen Nebenwirkungen führen. In dieser Hinsicht - und weil Hacks selten die beste Antwort sind - muss ich "offiziell" empfehlen, was andere gesagt haben: Custom Paint the button. Obwohl der Code hier möglicherweise übertrieben ist, wird in diesem Link unter CodeProject erläutert, wie das geht (VB-Link; Sie müssen übersetzen). Sie sollten in der Lage sein, den zweiten Rand vollständig zu entfernen.

1
John Rudy

Sie können auch eine unsichtbare Schaltfläche erstellen und sie aktivieren, wenn Sie eine andere Taste drücken.

0

Wenn Sie ein Textfeld und eine Schaltfläche Haben, schreiben Sie bei textchange-Ereignis des Textfelds button1.focus();

Es wird klappen.

0
Amit

Natürlich können Sie den Button selbst ziehen. Eine der Staatsflaggen ist fokussiert.

Gehen Sie also beim Zeichnungsereignis vor, wenn die Fahne fokussiert ist, und ziehen Sie die Schaltfläche wie gewünscht, andernfalls übergeben Sie sie einfach an die Basismethode.

0
Orion Adrian

Erwägen Sie, Ihren eigenen Zeichnungscode für die Schaltfläche zu implementieren. Auf diese Weise haben Sie die volle Kontrolle. In der Vergangenheit habe ich meine eigene Steuerungsableitung implementiert, mit der meine Schaltfläche benutzerdefiniert gemalt wird und alle Schaltflächenmerkmale für meine Zwecke implementiert werden. Sie sollten jedoch in der Lage sein, das Bild der Schaltfläche zu überschreiben und es selbst zu machen, wodurch gesteuert wird, wie es in jedem Status gezeichnet wird , auch wenn fokussiert.

0
Jeff Yates

Setzen Sie die FocusVisualStyle - Abhängigkeitseigenschaft in Ihrem Stil auf null, und der gepunktete Rahmen ist weg.

Von MSDN: Styling für den Fokus in Steuerelementen und FocusVisualStyle

Windows Presentation Foundation (WPF) Bietet zwei parallele Mechanismen zum Ändern von Des visuellen Erscheinungsbilds eines Steuerelements, wenn es den Tastaturfokus Erhält. Der erste Mechanismus besteht darin, Eigenschaftssetzer Für Eigenschaften wie Als IsKeyboardFocused innerhalb des Stils Oder der Vorlage zu verwenden, die auf das Steuerelement Angewendet wird. T Der zweite Mechanismus besteht darin, Einen separaten Stil als Wert Der FocusVisualStyle-Eigenschaft anzugeben. Der "visuelle Fokusstil" erstellt einen separaten visuellen Baum für einen Adorner , der auf das Steuerelement zeichnet, , anstatt das visuelle zu ändern Baum des Steuerelements oder eines anderen UI-Elements, indem es ersetzt. In diesem Thema werden die Szenarien beschrieben, in denen jeder dieser - Mechanismen angemessen ist.

Der extra border , den Sie sehen, wird durch den FocusVisualStyle und nicht in der Steuerelementvorlage definiert. Sie müssen den Stil entfernen oder überschreiben, um den Rand zu entfernen.

0
Pop Catalin