我正在VS2010中创建一个WPF应用程序。我正在使用多个网格控件分层在一起,以执行与选项卡控件类似的功能。网格控件具有不透明(白色)背景。
出现问题是因为无论我在设计窗口中“在前面”哪个网格,我仍然可以看到顶部面板“后面”的其他网格上所有其他控件的所有轮廓。这在视觉上非常混乱。
这只发生在设计时。在运行时,事情显示得很好。
如何关闭所有其他控件的轮廓?
下面的屏幕截图显示了我的顶部网格,它只包含4个文本框和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)
为什么不将每个'标签'放在用户控件中,然后你可以单独编辑它们?