2 Stimmen

Wie kann man mehrere Ebenen von Steuerelementen in WPF anzeigen?

Ich versuche, WPF zu lernen, und bis jetzt liebe ich es. Allerdings gibt es etwas fehlt oder einfach etwas, das ich nicht verstehe. Wie können wir mehrere Ebenen von Steuerelementen in WPF anzeigen? Der beigefügte Screenshot gibt eine gute Vorstellung davon, was ich zu tun versuche. Ich habe ein Fenster, und ich möchte etwas anderes darüber anzeigen. Wie kann ich das tun?

Screenshot

5voto

Matt Hamilton Punkte 193704

Wenn Sie zwei Elemente in der gleichen Zeile/Spalte in einem Raster platzieren, werden sie einfach übereinander gelegt. Sie können dann die Sichtbarkeit der einzelnen Elemente verwenden, um sie ein- oder auszublenden. Also zum Beispiel:

<Grid>
    ... row/column definitions
    <Grid Grid.Row="0" Grid.Column="0">
        ... main content here
    </Grid>
    <Grid Grid.Row="0" Grid.Column="0" x:Name="grid2">
        ... overlaid content here
    </Grid>
</Grid>

Jetzt wird der überlagerte Inhalt über dem Hauptinhalt angezeigt. Wenn Sie grid2.Visibility auf Visible/Hidden setzen, wird der überlagerte Inhalt angezeigt/versteckt.

2voto

Nir Punkte 28685

Mir fallen zwei Möglichkeiten ein, diesen Effekt zu erzielen (nicht rechteckige, halbtransparente Überlagerung eines Fensters, die über die Grenzen des Fensters hinausgeht).

Erste Option, DON'T USE THIS IN PRODUCTION CODE (AllowTransparency ist langsam und sehr buggy) - Machen Sie das Fenster größer als der eigentliche Inhalt, setzen Sie AllowsTransaprencey="True", so dass der Bereich "außerhalb" des Fensters ist transparent, jetzt alles, was Sie zu tun haben, für das Popup ist ein weiteres visuelles in den gleichen Container wie das "Fenster" hinzuzufügen.

Zweite Option, verwenden Sie ein Popup, müssen Sie Ihre Popup sorgfältig zu positionieren, rufen Sie SetWindowRgn über interop, um es nicht rechteckig und rufen Sie die Win32-API-Funktion, die Transparenz-Wert (sorry, erinnere mich nicht an den Namen im Moment), um es halbtransparent zu machen.

Die erste Option ist einfach zu implementieren und sieht besser aus als die zweite Option, aber sie ist langsamer und Sie werden auf alle möglichen seltsamen Fehler stoßen (einschließlich Quetschungen mit einigen Anzeigetreibern) - ich weiß das aus Erfahrung, als ich die Software, die ich verkaufe, von AllowTransparency auf SetWindowRgn umstellte, verschwanden 90 % der Quetschungsberichte.

Die zweite Option erfordert eine Menge nativer Win32-API-Aufrufe, aber sie sollte funktionieren.

1voto

Jon Skeet Punkte 1325502

Ich weiß selbst nicht viel über WPF, aber ist die Panel.ZIndex Vielleicht sind Sie ja an einer Immobilie interessiert?

1voto

Crippeoblade Punkte 3935

Können Sie Dekorationsschicht zu überlagern. Es handelt sich im Grunde um eine Rendering-Oberfläche, die jedes verzierte Element überlagert.

0voto

Steven Robbins Punkte 26083

Man könnte einen ähnlichen Effekt erzielen, indem man Dinge in einem Raster überlagert (die Dinge stapeln sich einfach übereinander, wenn sie sich in derselben Zelle befinden), aber mein Spinnensinn würde mir sagen, dass das nur ein weiteres Fenster ist, das wie etwas definiert ist:

<Window
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="SubWindow" Height="100" Width="100" WindowStyle="None" AllowsTransparency="True" Opacity="0.5"  >

Sie können es dann in Ihrem Hauptfenster anzeigen, indem Sie etwas wie folgt tun:

SubWindow sw = new SubWindow ();
sw.DoModal();

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X