如何在Visual Studio 2010,WPF中删除控件轮廓?

时间:2010-11-08 16:51:18

标签: wpf visual-studio-2010

我正在VS2010中创建一个WPF应用程序。我正在使用多个网格控件分层在一起,以执行与选项卡控件类似的功能。网格控件具有不透明(白色)背景。

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

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

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

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

alt text

4 个答案:

答案 0 :(得分:3)

我不知道如何关闭这些线路,或者即使你可以,但我可以说,每当我完成这类工作时,无论是Win32对话框,Winforms还是WPF,我总是< / em>后悔堆积这样的东西。

几乎可以肯定,将它拆分为单独的用户控件会更好,这样就可以单独处理各种“页面”。

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

答案 1 :(得分: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吗?它可能更简单。

我还必须强烈支持威尔的观察,认为这是一个糟糕的设计。你是如何“坚持下去”的?如果这是政治上的事情,我很抱歉。但从技术角度来看,使用模板将其重构为真正的制表控件应该非常容易。

答案 2 :(得分:0)

如何查看答案here?你或许可以沿着这些方向做点什么......

或者在设计时,您可以在后面的代码中设置所有列/行定义而不是?这应该摆脱你所有的线......然后在你的设计主要分类后再将xaml放回去。

答案 3 :(得分:0)

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