Wie Tastatur und Maus-Ereignisse in einem Teil der visuellen Struktur zu deaktivieren, ohne IsEnabled zu verwenden?

StackOverflow https://stackoverflow.com/questions/1113518

  •  12-09-2019
  •  | 
  •  

Frage

Ich habe die Anforderung pseudo-modalen Dialoge in WPF zu bauen. Das heißt, für einige spezifischen (technische) Gründe ist die Software nicht modale Dialoge zum Laichen erlaubt. Stattdessen mit „embedded“ modalen Dialogen interagieren sollte der Benutzer bei Bedarf.

Ich fand eine Lösung, die sehr gut mit MVVM arbeitet und kümmert sich um den Dispatcher und den synchronen Charakter modale Dialoge. Aber ich bin vor einem Problem mit der Benutzereingabe im Hintergrund GUI deaktivieren. Einstellung aller Kontrollen auf IsEnabled = false leider nicht akzeptabel ist, da sie den visuellen Zustand der Hintergrundkontrollen (Graustufen -> schlechte Lesbarkeit) ändert.

Gibt es eine gerade nach vorne Weg, um die Benutzereingabe (einschließlich Fokus und Tastatur) im Hintergrund ohne Änderung der visuellen Zustand?

deaktivieren

Vielen Dank für Ihre Hilfe!

War es hilfreich?

Lösung

Ich habe ein Projekt auf Github , die eine benutzerdefinierte FrameworkElement bietet, die Sie modalen Inhalt über angezeigt werden können der primäre Inhalt.

Die Steuerung kann wie folgt verwendet werden:

<c:ModalContentPresenter IsModal="{Binding DialogIsVisible}">
    <TabControl Margin="5">
            <Button Margin="55"
                    Padding="10"
                    Command="{Binding ShowModalContentCommand}">
                This is the primary Content
            </Button>
        </TabItem>
    </TabControl>

    <c:ModalContentPresenter.ModalContent>
        <Button Margin="75"
                Padding="50"
                Command="{Binding HideModalContentCommand}">
            This is the modal content
        </Button>
    </c:ModalContentPresenter.ModalContent>

</c:ModalContentPresenter>

Features:

  • Displays beliebiger Inhalt.
  • Deaktiviert nicht den Hauptinhalt während des modale Inhalt angezeigt wird.
  • Deaktiviert Maus und Tastatur Zugriff auf den Hauptinhalt während der modalen Inhalt angezeigt wird.
  • Wird nur auf den Inhalt modal es deckt nicht die gesamte Anwendung.
  • kann durch Bindung an die IsModal Eigenschaft in einer MVVM freundlichen Art und Weise verwendet werden.

Andere Tipps

Sie können die .IsHitTestVisible Eigenschaft alle Mausklicks zu dieser Steuerung / Fenster zu deaktivieren. Dies funktioniert genauso wie Einstellungen .IsEnabled, aber ohne die visuelle Zustandsänderung (grau Kontrollen).

Ich habe mit dem gleichen Problem zu kämpfen (auch MVVM). Ich verwende auch ein Usercontrol-Overlay anstelle eines modalen Popup. (In meinem Fall, Ich mag nicht IsEnabled = false nicht wegen der behinderten Stil, sondern weil IsEnabled Makeln macht es schwer Tastatur zu bekommen Fokus zurück.)

Ich bin mit der Overlay-Lösung (oben) zum Blockieren Mausaktion. Und für die „andere Hälfte der Lösung“ - -disabling Tastatureingabe - Ich reiche dies im Hauptfenster:

Window
+----------------+  private void Window_PreviewKeyDown(object sender,
|                |                                     KeyEventArgs e){
|  Transparent   |      if (this.myDialog.Visibility == Visibility.Visible){
|                |          e.Handled = true;
|  +----------+  |      }
|  | myDialog |  |  }
|  | content  |  |
|  +----------+  |
|                |
+----------------+

Eine Teillösung könnte sein, zu Ihrem „Dialog“ Steuerung decken das gesamte Anwendungsfenster zu machen, haben aber das meiste davon transparent sein, mit undurchsichtigen Dialog Inhalt in der Mitte, wie:

+----------------+
|                |
|  Transparent   |
|                |
|  +----------+  |
|  | dialog   |  |
|  | content  |  |
|  +----------+  |
|                |
+----------------+

Aber das ist ein bisschen wie ein Hack.

Der direkte Weg zu Ihrer Frage zu beantworten, können Sie einen Trigger auf der IsEnabled Eigenschaft auf Kontrollen verwenden, um die Farben zu halten ändert. Vielleicht hat jemand mit Visual Studio auf dem Feld kann ein Codebeispiel zur Verfügung stellen. :)

Antwort auf Ihren Kommentar:

Ich mache mir Sorgen, dass diese Antwort ein bisschen schwierig wird immer, aber Sie können auf Ihren Kontrollen die IsTabStop und Fokussierbare Eigenschaften auf false gesetzt, dass das Verhalten zu erhalten.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top