2010-11-08 50 views
2

我正在VS2010中创建一个WPF应用程序。我正在使用多个网格控件分层叠加,以执行与选项卡控件类似的功能。网格控件具有不透明(白色)背景。如何删除Visual Studio 2010中的控件大纲,WPF?

发生这种问题是因为无论我在设计窗口中“前面”有哪个网格,我仍然可以看到顶部面板“后面”的其他网格上的所有其他控件的所有轮廓。这在视觉上非常混乱。

这只发生在设计时。在运行时,事情显示得很好。

如何关闭所有其他控件的轮廓?

下面的屏幕截图显示了我的顶部网格,其中只包含4个文本框和4个单选按钮,但显示其他网格上所有其他控件的轮廓。

alt text

回答

3

设置任何网格控件,其不希望看到一个轮廓的RenderTransform,例如:

<Grid RenderTransform="1 0 0 1 10000 10000"> 

你可以使用一个附加属性,使这个方便,让您的网格自动设置为每当它是通过编写简单的隐藏变换:

<Grid my:OutOfThisWorld.WhenHidden="True"> 

下面是代码:

public class OutOfThisWorld : DependencyObject 
{ 
    // GoAway 
    public static bool GetGoAway(DependencyObject obj) { return (bool)obj.GetValue(GoAwayProperty); } 
    public static void SetGoAway(DependencyObject obj, bool value) { obj.SetValue(GoAwayProperty, value); } 
    public static readonly DependencyProperty GoAwayProperty = DependencyProperty.RegisterAttached("GoAway", typeof(bool), typeof(OutOfThisWorld), new UIPropertyMetadata 
    { 
    PropertyChangedCallback = (obj, e) => 
    { 
     obj.SetValue(UIElement.RenderTransformProperty, 
     (bool)e.NewValue ? new TranslateTransform(100000,10000) : null); 
    } 
    }); 

    // WhenHidden 
    public static bool GetWhenHidden(DependencyObject obj) { return (bool)obj.GetValue(WhenHiddenProperty); } 
    public static void SetWhenHidden(DependencyObject obj, bool value) { obj.SetValue(WhenHiddenProperty, value); } 
    public static readonly DependencyProperty WhenHiddenProperty = DependencyProperty.RegisterAttached("WhenHidden", typeof(bool), typeof(OutOfThisWorld), new PropertyMetadata 
    { 
    PropertyChangedCallback = (obj, e) => 
    { 
     if((bool)e.NewValue) 
     BindingOperations.SetBinding(obj, GoAwayProperty, 
      new Binding("Visibility") 
      { 
      RelativeSource=RelativeSource.Self, 
      Converter = new IsHiddenConverter() 
      }); 
    } 
    }); 

    class IsHiddenConverter : IValueConverter 
    { 
    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
    { 
     return (Visibility)value == Visibility.Hidden; 
    } 
    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) { throw new NotImplementedException(); } 
    } 
} 

工作原理:设置OutOfThisWorld.WhenHidden将创建一个到OutOfThisWorld.GoAway属性的绑定,只要目标的可见性为“隐藏”,GoAway属性就为true。当GoAway真正实现时,将添加RenderTransform。

说了这么多,你有没有考虑过使用Visibility = Collapsed而不是Visibility = Hidden?这可能会更简单。

我也必须强烈支持Will的观察,这是一个糟糕的设计。如何“坚持下去”是真的吗?如果这是一件政治事情,我为你感到难过。但从技术角度来看,使用模板将其重构为真正的选项卡控件应该非常容易。

+0

谢谢Ray,这个解决方法解决了问题中提到的问题。还要感谢您和Will的设计建议。我已经在竞选'不烂'的设计。 – Stewbob 2010-11-19 18:43:45

0

如何检查出来的答案here?您可能可以沿着这些方向做些什么...

或者在设计时,您可以在代码背后设置所有的列/行定义,也许可以?这应该摆脱所有的行......然后把xaml放回来,一旦你的设计主要分类。

3

我不知道如何关闭线路,或者即使可以,但我可以说每当我做完这类东西,无论是Win32对话框,Winforms还是WPF,我都会总是后悔像这样堆起来的东西。

你几乎肯定会更好地把它分解成单独的用户控件,以便各个'页面'分开处理。

在我看来,箱子的问题是您真正问题的症状,而不是问题本身。

+0

我同意我目前使用的方法不是最优的,但它是我目前所坚持的。 – Stewbob 2010-11-15 16:03:39

0

为什么不把每个'标签'放在用户控件中,那么你可以单独编辑它们?

相关问题