2009-08-24 41 views
23

que tienen una forma de WPF que básicamente es el siguiente:elementos Ocultar WPF en el diseñador de Visual Studio

<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 cuadrícula de superposición esconde todo lo demás (es decir, el "contenido normal") y sólo se muestra en circunstancias especiales (es decir, si la conexión de red se desactiva). Esto funciona perfectamente bien cuando ejecuta el programa.

Ahora, en modo de diseño, el problema es que Visual Studio ignora el Visibility="Hidden". Por lo general, esto tiene mucho sentido (después de todo, quiero poder editar los elementos ocultos de la interfaz de usuario), pero en mi caso es molesto, porque me impide editar las cosas en DockPanel en el diseñador.

Por lo tanto, lo que me gustaría hacer es algo así:

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

Pero, por desgracia, no hay tal propiedad, o al menos ninguno que yo sepa. ¿Algunas ideas?

+1

Estoy buscando una solución de una manera diferente, ya que estoy tratando de descubrir cómo lo logra TabControl. Con TabControl puede establecer una pestaña específica para ser seleccionada, pero dentro del diseñador ignorará esto si coloca el cursor dentro del código de una de las pestañas o en las pestañas reales del diseñador y en su lugar muestra la pestaña seleccionada en tiempo de diseño . Creo que el control Popup debería funcionar de la misma manera y estoy trabajando en algo similar al control Silverlight ChildWindow que me dará este tipo de comportamiento en el tiempo de diseño. – jpierson

Respuesta

11

Buena solución, estaba teniendo un problema similar y estoy de acuerdo que hay casos en que es necesario. Aquí hay una actualización menor que le permite editar el valor para activar y desactivar IsHidden durante el diseño. También apliqué ScaleTransform en lugar de establecer Anchura y Altura para reducir un poco los artefactos de pantalla si se muestran los controles, etc. y para evitar conflictos si el control que se oculta ya tiene propiedades de Ancho y Alto establecidas (suponiendo que el control ya no tiene LayoutTransform establecido en él).

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. Buena extensión, gracias por compartir! – Heinzi

+0

Esto ayudó mucho. Me encanta el código como este donde puedo aprender. Gracias. – MikeMalter

+4

+1 ¡Agradable! Pero necesito un traductor de VB a C# ;-) – Jim

3

Aparte de no usar el diseñador (realmente, considere esto) podría separar el contenido de Grid en un . De esta forma, puede actualizar ese UserControl aislado de la lógica de visibilidad.

+1

Acerca del uso del diseñador: Sí, sé a qué se refiere. Solo uso el diseñador para la navegación (haga clic en un control y el editor salta al código XAML). Esto, sin embargo, es una característica muy esencial para grandes archivos XAML. – Heinzi

7

Puesto que no hay es incorporado manera de hacer esto, decidí poner en práctica una solución a mí mismo, que fue sorprendentemente fácil de hacer uso de las propiedades asociadas:

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 

Después de declarar un espacio de nombres, la función puede ser usado así:

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

Esto fue muy útil. Gracias. – MikeMalter

2

Me encontré con un problema similar recientemente.

Estoy usando un rectángulo para oscurecer la ventana principal durante la ejecución de un diálogo modal. Tengo los datos de Visibilidad vinculados, pero el Rectángulo hizo inutilizable el diseñador. Enloquecí el índice Z un enlace de datos de una vez, y un valor de reserva fue menor que la ventana que quería ocultar. Cuando se inicia la aplicación, el índice Z del rectángulo está ligado a un valor más alto que la ventana.

7

¡Buen trabajo! Traducido a C# y cambio la propiedad que está cambiando a 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

Estoy en el otro lado ... odio VS 2012 por ocultar los controles WPF ocultos en el diseñador. Necesito verlos código gregsdennis por lo que he modificado para:

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" mostrará el control en modo de diseño.

53

A partir de VS2012 sólo puede utilizar el espacio de nombres de mezcla IsHidden atributo:

  • añadir que, si no está ya presente xmlns: d = "http://schemas.microsoft.com/expression/blend/2008"
  • puesta d: IsHidden = "true" en el elemento que desee ocultar en tiempo de diseño única
+6

Esto debe marcarse como la respuesta –

+0

No funciona junto con el atributo de Visibilidad. La visibilidad parece tener prioridad. Y supongo que no hay d: Visibilidad :( – Edgar

+0

¡Genial! En ​​VS2017, la mezcla xmlns ya está allí, pero esta solución todavía no funciona ("La propiedad 'IsHidden' no existe en mezcla ..."). Tengo que buscar para obtener otra información y descubrir, después de la línea que contiene ** xmlns: d = "http://schemas.microsoft.com/expression/blend/2008" ** , debe incluir otras dos líneas: ** xmlns: mc = "http://schemas.openxmlformats.org/markup-compatibility/2006" mc: Ignorable = "d" ** Entonces el atributo IsHidden funciona perfectamente. (Lo siento, el formato está limitado aquí) –

0

drongal en realidad tenía que establecer DesignModeTool.IsHidden = "true" para hacer que se muestre mis partes ocultas de mi control de usuario.

Cuestiones relacionadas