2009-08-24 13 views
23

Ho una forma WPF che appare sostanzialmente in questo modo:elementi Nascondi WPF in Visual Studio progettista

<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> 

La griglia di sovrapposizione nasconde tutto il resto (cioè il "normale contenuto") e viene mostrata solo in circostanze particolari (vale a dire se la connessione di rete va giù). Funziona perfettamente quando esegue il programma.

Ora, nella modalità di progettazione , il problema è che Visual Studio ignora Visibility="Hidden". Di solito, questo ha perfettamente senso (dopotutto, voglio essere in grado di modificare gli elementi dell'interfaccia utente nascosti), ma nel mio caso è fastidioso, perché mi impedisce di modificare le cose nel DockPanel nella finestra di progettazione.

Quindi, quello che mi piacerebbe fare è qualcosa di simile:

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

Ma, ahimè, non c'è tale proprietà, o almeno nessuno che io sappia. Qualche idea?

+1

Sto andando su una soluzione in un modo diverso in cui sto cercando di capire come il TabControl raggiunge questo. Con TabControl è possibile impostare una scheda specifica da selezionare, ma all'interno del designer la ignorerà se si posiziona il cursore all'interno del codice per una delle schede o sulle schede effettive nella finestra di progettazione e si visualizzerà invece la scheda selezionata in fase di progettazione . Penso che il controllo Popup dovrebbe funzionare allo stesso modo e sto lavorando su qualcosa di simile al controllo Silverlight ChildWindow che mi darà questo tipo di comportamento in fase di progettazione. – jpierson

risposta

11

Bella soluzione, stavo avendo un problema simile e sono d'accordo che ci sono casi in cui è necessario. Ecco un aggiornamento minore che consente di modificare il valore per attivare e disattivare IsHidden durante la progettazione. Ho anche applicato un ScaleTransform invece di impostare Larghezza e Altezza per ridurre un po 'gli artefatti dello schermo se vengono visualizzati grip di controllo, ecc. Per evitare conflitti se il controllo nascosto ha già le proprietà Width e Height impostate (assumendo che il controllo non abbia già un LayoutTransform impostato su di esso).

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. Bella estensione, grazie per la condivisione! – Heinzi

+0

Questo ha aiutato molto. Amo il codice come questo dove posso imparare. Grazie. – MikeMalter

+4

+1 Bello! Ma ho bisogno di un traduttore da VB a C# ;-) – Jim

3

Oltre a non utilizzare il designer (in realtà, si consideri questo) è possibile separare il contenuto dello Grid in un numero UserControl separato. In questo modo, potresti semplicemente aggiornare lo UserControl in isolamento dalla logica di visibilità.

+1

Informazioni sull'utilizzo del designer: Sì, so cosa intendi. Io uso solo il designer per la navigazione (fai clic su un controllo e l'editor salta al codice XAML). Questa, tuttavia, è una funzionalità molto essenziale per i file XAML di grandi dimensioni. – Heinzi

7

Dal momento che non v'è built-in modo per fare questo, ho deciso di implementare una soluzione di me stesso, che era sorprendentemente facile da fare utilizzando proprietà associate:

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 

Dopo aver dichiarato uno spazio dei nomi, la funzione può essere utilizzato in questo modo:

<Grid ... local:DesignModeTool.IsHidden="True"> 
[stuff I don't want to be shown in the designer] 
</Grid> 
+0

Questo è stato molto utile. Grazie. – MikeMalter

2

Mi sono imbattuto in un problema simile di recente.

Sto usando un rettangolo per oscurare la finestra principale durante l'esecuzione di una finestra di dialogo modale. Ho i dati di visibilità vincolati, ma il rettangolo ha reso il progettista inutilizzabile. Ho fatto arrabbiare l'indice Z con un bind di dati una volta, e un valore di fallback era inferiore alla finestra che volevo oscurare. All'avvio dell'applicazione, l'indice Z del rettangolo è associato a un valore superiore rispetto alla finestra.

7

Bel lavoro! Ho tradotto in C# e cambiato la proprietà che sta cambiando in RenderTransform.

static 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.RenderTransform = (bool)e.NewValue 
      ? new ScaleTransform(0, 0) 
      : null; 
    } 
} 
1

Io sono dall'altra parte ... odio VS 2012 per nascondere i controlli WPF nascosti nel designer. Ho bisogno di vedere loro codice gregsdennis così ho modificato per:

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" mostrerà il controllo in modalità di progettazione.

53

Partendo da VS2012 si può semplicemente utilizzare lo spazio dei nomi Miscela IsHidden attributo:

  • aggiungere se non già presente xmlns: d = "http://schemas.microsoft.com/expression/blend/2008"
  • put d: IsHidden = "true" sull'elemento che si vuole nascondere in fase di progettazione solo
+6

Questo dovrebbe essere contrassegnato come la risposta –

+0

Non funziona insieme all'attributo Visibilità. La visibilità sembra avere la priorità. E immagino che non ci sia d: Visibilità :( – Edgar

+0

Cool! In VS2017 la miscela xmlns è già lì, ma questa soluzione non ha funzionato ("Proprietà 'IsHidden' non esiste in blend ..."). Devo cercare per ulteriori informazioni e scoperto che dopo la riga contenente ** xmlns: d = "http://schemas.microsoft.com/expression/blend/2008" ** è necessario includere altre due righe: ** xmlns: mc = "http://schemas.openxmlformats.org/markup-compatibility/2006" mc: Ignorable = "d" ** Quindi l'attributo IsHidden funziona perfettamente (mi dispiace, la formattazione è limitata qui) –

0

realtà drongal ho dovuto impostare DesignModeTool.IsHidden = "true" per renderlo mostrare le mie parti nascoste della mia UserControl.

Problemi correlati