WPF可见性属性设计器问题

3

最近我在设计时遇到了Visibility属性的问题。在运行时一切正常,但是在设计时,Visibility属性没有效果。

我已经重新安装了Visual Studio和.NET框架,但问题仍然存在。

示例代码:

<StackPanel>
        <TextBlock Text="X" Visibility="Collapsed" Background="Red" />
        <TextBlock Text="Y"></TextBlock>
</StackPanel>

在运行时,X会被折叠起来,而在设计时则会显示出来。


虽然这是一个好的发现,但我仍然怀疑这是否是一个问题。我的意思是,对我来说,它似乎是一种期望的功能。 - Rohit
这在其他机器上正常工作,所以我猜测这个特定的安装有问题。我可以绕过它,但如果还有其他东西出了问题,那就让我担心了。 - Goran
2个回答

3

如果这个解决方案可以为大多数用户解决问题,我会将其标记为答案。 - Goran
对我也起作用了。我之前也不知道在SP1之前它可以在一些机器上运行。 - Rick Sladkey

1

当你修改代码后,尝试按下 Ctrl + Shift + B,这可能会对你有所帮助。

但是我建议你安装 Microsoft Expression Blend 并将所有 Xaml 标记放在上面。


更新:

或者您可以使用这个:

public class VisibilityFixer: DependencyObject
{
    public static bool GetFixDesigner(DependencyObject obj)
    {
        return (bool)obj.GetValue(FixDesignerProperty);
    }

    public static void SetFixDesigner(DependencyObject obj, bool value)
    {
        obj.SetValue(FixDesignerProperty, value);
    }

    // Using a DependencyProperty as the backing store for FixDesigner.  This enables animation, styling, binding, etc...
    public static readonly DependencyProperty FixDesignerProperty =
        DependencyProperty.RegisterAttached("FixDesigner", typeof(bool), typeof(VisibilityFixer),
        new UIPropertyMetadata(false, new PropertyChangedCallback(PropertyChanged)));

    public static void PropertyChanged(DependencyObject sender, DependencyPropertyChangedEventArgs e)
    {
        var obj = sender as FrameworkElement;

        if (obj != null)
        {
            if ((bool)(DesignerProperties.IsInDesignModeProperty.GetMetadata(typeof(DependencyObject)).DefaultValue)) 
            {
               if (obj.Visibility == Visibility.Collapsed)
                {
                    obj.Opacity = 0;
                    obj.Height = 0;
                    obj.Width = 0;
                } 
                else if (obj.Visibility == Visibility.Hidden)
                {
                    obj.Opacity = 0;
                }             
            }
        }
    }
}

并像这样使用它。

 <StackPanel x:Name="LayoutRoot">
    <TextBlock TextWrapping="Wrap" 
         Visibility="Collapsed" 
         fx:VisibilityFixer.FixDesigner="True" 
         Text="TextBlock3243" HorizontalAlignment="Left" 
         Background="Red" />
    <TextBlock HorizontalAlignment="Left" TextWrapping="Wrap"><Run Text="TextBlock"/></TextBlock>
</StackPanel>

然后使用 Ctrl + Shift + B


谢谢您的建议,但重新构建项目、重新打开设计窗口或重新打开解决方案都无法解决问题。这不是设计师没有更新的问题,而是设计师根本没有应用可见性属性的问题。 - Goran
嗯,我实际上发现我有同样的问题.. 但在Expression Blend中一切都正常工作,所以考虑一下.. - obenjiro
阅读我的更新..你可以将我的代码扩展为通用的,或者更易用的..我只是举了一个例子.. - obenjiro
1
+1 鼓励一下。但是在我的家用电脑和同事的电脑上,可见性在 VS 中运行正常。我猜测可能是我的安装出了问题。我会检查一下并报告如果发现了什么问题。 - Goran

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接