2009-08-24 33 views
23

Ich habe eine WPF-Form, die im Grunde wie folgt aussieht:ausblenden WPF-Elemente in Visual Studio Designer

<Window ...> 
    <Grid> 
    <DockPanel> 
     [content shown during normal operation] 
    </DockPanel> 

    <Grid Background="#CCCC" Visibility="Hidden"> 
     [overlay grid which is only shown during special circumstances] 
    </Grid> 
    </Grid> 
</Window> 

Das Overlay Gitter verbirgt alles andere (dh der „normalen Inhalt“) und wird nur unter besonderen Umständen gezeigt (dh wenn die Netzwerkverbindung ausfällt). Das funktioniert einwandfrei, wenn das Programm läuft.

Jetzt in Entwurfsmodus ist das Problem, dass Visual Studio die Visibility="Hidden" ignoriert. In der Regel ist das sehr sinnvoll (schließlich möchte ich die versteckten UI-Elemente bearbeiten können), aber in meinem Fall ist es ärgerlich, weil es mich daran hindert, das Zeug im Designer im DockPanel zu bearbeiten.

Also, was ich möchte ist, etwas zu tun wie folgt aus:

<Grid Background="#CCCC" Visibility="Hidden" VS.ShowInDesigner="False"> 
    [overlay grid which is only shown during special circumstances] 
</Grid> 

Aber leider gibt es keine solche Eigenschaft, oder zumindest keine, die ich kenne. Irgendwelche Ideen?

+1

Ich gehe auf eine andere Weise über eine Lösung, indem ich versuche herauszufinden, wie das TabControl dies erreicht. Mit dem TabControl können Sie eine bestimmte Registerkarte auswählen, die innerhalb des Designers ignoriert wird, wenn Sie den Cursor innerhalb des Codes für eine der Registerkarten oder auf den tatsächlichen Registerkarten im Designer platzieren und stattdessen die Entwurfszeit-Registerkarte anzeigen . Ich denke, das Popup-Steuerelement sollte genauso funktionieren und ich arbeite an etwas ähnlich dem Silverlight ChildWindow-Steuerelement, das mir diese Art von Entwurfszeitverhalten geben wird. – jpierson

Antwort

11

Schöne Lösung, ich hatte ein ähnliches Problem und ich stimme zu, dass es Fälle gibt, wo es gebraucht wird. Hier ist ein kleines Update, mit dem Sie den Wert bearbeiten können, um IsHidden beim Entwerfen ein- und auszuschalten. Ich habe auch eine ScaleTransform angewendet, anstatt Breite und Höhe einzustellen, um Bildschirmartefakte etwas zu reduzieren, wenn Kontrollgriffe usw. angezeigt werden, und um Konflikte zu vermeiden, wenn das ausgeblendete Steuerelement bereits Eigenschaften für Breite und Höhe besitzt (vorausgesetzt, das Steuerelement hat noch keine LayoutTransform darauf eingestellt).

Public Class DesignModeTool 

    Public Shared ReadOnly IsHiddenProperty As DependencyProperty = DependencyProperty.RegisterAttached(_ 
    "IsHidden", GetType(Boolean), GetType(DesignModeTool), _ 
    New FrameworkPropertyMetadata(False, New PropertyChangedCallback(AddressOf OnIsHiddenChanged))) 

    Public Shared Sub SetIsHidden(ByVal element As FrameworkElement, ByVal value As Boolean) 
    element.SetValue(IsHiddenProperty, value) 
    End Sub 

    Public Shared Function GetIsHidden(ByVal element As FrameworkElement) As Boolean 
    Return DirectCast(element.GetValue(IsHiddenProperty), Boolean) 
    End Function 

    Private Shared Sub OnIsHiddenChanged(ByVal d As DependencyObject, ByVal e As DependencyPropertyChangedEventArgs) 
    If System.ComponentModel.DesignerProperties.GetIsInDesignMode(d) AndAlso True.Equals(e.NewValue) Then 
     With DirectCast(d, FrameworkElement) 
     .LayoutTransform = New ScaleTransform(0.001, 0.001) 
     End With 
    ElseIf System.ComponentModel.DesignerProperties.GetIsInDesignMode(d) AndAlso False.Equals(e.NewValue) Then 
     With DirectCast(d, FrameworkElement) 
     .LayoutTransform = Nothing 
     End With 
    End If 
    End Sub 
End Class 
+0

+1. Schöne Erweiterung, vielen Dank für das Teilen! – Heinzi

+0

Das hat sehr geholfen. Ich liebe Code wie diesen, wo ich lernen kann. Vielen Dank. – MikeMalter

+4

+1 Schön! Aber ich brauche einen VB zu C# Übersetzer ;-) – Jim

3

Anders als nicht mit dem Designer (wirklich, bedenken Sie dies) können Sie den Inhalt der Grid in eine separate UserControl trennen. Auf diese Weise können Sie das UserControl isoliert von der Sichtbarkeitslogik aktualisieren.

+1

Über die Verwendung des Designers: Ja, ich weiß was du meinst. Ich benutze den Designer nur für die Navigation (klicken Sie auf ein Steuerelement und der Editor springt zum XAML-Code). Dies ist jedoch eine sehr wichtige Funktion für große XAML-Dateien. – Heinzi

7

Da es keine integrierte Möglichkeit, dies zu tun, entschied ich mich, eine Lösung selbst, die überraschend einfach zu implementieren war zu tun mit beiliegender Eigenschaft:

Public Class DesignModeTool 
    Public Shared ReadOnly IsHiddenProperty As DependencyProperty = DependencyProperty.RegisterAttached(_ 
     "IsHidden", GetType(Boolean), GetType(DesignModeTool), _ 
     New FrameworkPropertyMetadata(False, New PropertyChangedCallback(AddressOf OnIsHiddenChanged))) 

    Public Shared Sub SetIsHidden(ByVal element As UIElement, ByVal value As Boolean) 
     element.SetValue(IsHiddenProperty, value) 
    End Sub 

    Public Shared Function GetIsHidden(ByVal element As UIElement) As Boolean 
     Return DirectCast(element.GetValue(IsHiddenProperty), Boolean) 
    End Function 

    Private Shared Sub OnIsHiddenChanged(ByVal d As DependencyObject, ByVal e As DependencyPropertyChangedEventArgs) 
     If System.ComponentModel.DesignerProperties.GetIsInDesignMode(d) AndAlso True.Equals(e.NewValue) Then 
      With DirectCast(d, FrameworkElement) 
       .Width = 0 
       .Height = 0 
      End With 
     End If 
    End Sub 
End Class 

Nach einem Namensraum deklariert, kann die Funktion sein wie folgt verwendet:

+0

Das war sehr hilfreich. Vielen Dank. – MikeMalter

2

Ich stieß vor kurzem auf ein ähnliches Problem.

Ich benutze ein Rechteck, um das Hauptfenster während der Ausführung eines modalen Dialogs zu verdecken. Ich habe die Sichtbarkeitsdaten gebunden, aber das Rectangle hat den Designer unbrauchbar gemacht. Ich verrückte den Z-Index eine einmalige Datenbindung, und ein Fallback-Wert war niedriger als das Fenster, das ich verdecken wollte. Wenn die Anwendung gestartet wird, ist der Z-Index des Rectangle an einen höheren Wert als das Fenster gebunden.

7

Gute Arbeit! Ich übersetzte in C# und ändere die Eigenschaft in RenderTransform.

1

Ich bin auf der anderen Seite ... hasse VS 2012 für versteckte versteckte WPF Kontrollen in Designer. Ich brauche sie, um zu sehen, so dass ich gregsdennis Code geändert haben:

public class DesignModeTool 
{ 
    public static readonly DependencyProperty IsHiddenProperty = DependencyProperty.RegisterAttached("IsHidden", typeof(bool), typeof(DesignModeTool), new FrameworkPropertyMetadata(false, new PropertyChangedCallback(OnIsHiddenChanged))); 

    public static void SetIsHidden(FrameworkElement element, bool value) 
    { 
     element.SetValue(IsHiddenProperty, value); 
    } 

    public static bool GetIsHidden(FrameworkElement element) 
    { 
     return (bool)element.GetValue(IsHiddenProperty); 
    } 

    private static void OnIsHiddenChanged(DependencyObject d, 
              DependencyPropertyChangedEventArgs e) 
    { 
     if (!DesignerProperties.GetIsInDesignMode(d)) return; 
     var element = (FrameworkElement)d; 
     element.Visibility=Visibility.Visible; 

    } 
} 

wpfClasses2: DesignModeTool.IsHidden = "false" zeigt die Steuerung im Designer-Modus.

53

von VS2012 Starten Sie einfach den Mischnamespace verwenden können IsHidden Attribut:

  • hinzufügen, wenn nicht bereits vorhanden xmlns: d = "http://schemas.microsoft.com/expression/blend/2008"
  • put d: IsHidden = „true“ auf Element möchten Sie zur Entwurfszeit
+6

Dies sollte als die Antwort markiert werden –

+0

Funktioniert nicht in Verbindung mit dem Sichtbarkeitsattribut. Sichtbarkeit scheint Priorität zu haben. Und ich denke, es gibt keine d: Sichtbarkeit :( – Edgar

+0

Cool! In VS2017 ist die Mischung xmlns schon da, aber diese Lösung hat immer noch nicht funktioniert ("Property 'IsHidden' existiert nicht in der Mischung ..."). Ich muss suchen für eine weitere Information und herausgefunden, dass nach der Zeile mit ** xmlns: d = "http://schemas.microsoft.com/expression/blend/2008" ** Sie zwei andere Zeilen enthalten müssen: ** xmlns: mc = "http://schemas.openxmlformats.org/markup-compatibility/2006" mc: Ignorierbar = "d" ** Dann funktioniert das IsHidden-Attribut perfekt. (Sorry, Formatierung ist hier begrenzt) –

0

Eigentlich nur verstecken drongal ich DesignModeTool.IsHidden = „TRUE“ gesetzt hatte, um es meine verborgenen Teile meines Usercontrol zu machen zeigen.

Verwandte Themen