在Visual Studio设计器中隐藏WPF元素

j8ag8udp  于 2023-03-13  发布在  其他
关注(0)|答案(8)|浏览(155)

我有一个WPF表单,基本上看起来像这样:

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

覆盖网格隐藏了所有其他内容(即“正常内容”),只有在特殊情况下才会显示(即如果网络连接中断)。这在运行程序时非常有效。
现在,在设计模式中,问题是Visual Studio忽略了Visibility="Hidden"。通常,这是非常有意义的(毕竟,我希望能够编辑隐藏的UI元素),但在我的情况下,这是令人讨厌的,因为它阻止我编辑设计器中DockPanel中的内容。
所以,我想做的是这样的:

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

但是,唉,没有这样的财产,或者至少我不知道。有什么想法吗?

vecaoik1

vecaoik11#

从VS2012开始,您可以只使用Blend名称空间IsHidden属性:

  • 添加,如果还不存在xmlns:d=”http://schemas.microsoft.com/expression/blend/2008“
  • 将d:IsHidden=“true”放在只想在设计时隐藏的元素上
yi0zb3m4

yi0zb3m42#

好办法,我也遇到过类似的问题,我同意在某些情况下需要这样做。这里有一个小的更新,允许你在设计时编辑值来打开和关闭IsHidden。我还应用了ScaleTransform而不是设置宽度和高度,以减少屏幕伪像,如果控件夹等显示,并避免冲突,如果被隐藏的控件已经设置了宽度和高度属性(假设控件尚未设置LayoutTransform)。

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
ef1yzkbh

ef1yzkbh3#

干得好!我把它翻译成了C#,并把它的属性改成了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;
    }
}
uemypmqf

uemypmqf4#

由于没有内置的方法来实现这一点,我决定自己实现一个解决方案,使用附加属性可以非常容易地做到这一点:

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

声明命名空间后,可以按如下方式使用该功能:

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

c9x0cxw05#

除了不使用设计器之外(真的,考虑一下这个),您可以将Grid的内容分离到一个单独的UserControl中,这样,您就可以独立于可见性逻辑更新那个UserControl

shstlldc

shstlldc6#

我最近也遇到过类似的问题。
我正在使用一个Rectangle在模式对话框执行期间隐藏主窗口。我绑定了可见性数据,但是Rectangle使设计器无法使用。我将Z索引作为一次性数据绑定,并且回退值低于我想要隐藏的窗口。当应用程序启动时,Rectangle的Z索引被绑定到一个高于窗口的值。

yvgpqqbh

yvgpqqbh7#

我在另一边...讨厌VS 2012在设计器中隐藏隐藏WPF控件。我需要看到它们,所以我修改了gregsdennis代码:

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”将在设计器模式下显示控件。

vwhgwdsa

vwhgwdsa8#

可能对其他人有用。如果你想在VS2022的设计器模式下隐藏元素:

d:Visibility="Hidden"

相关问题