设置任何网格控件,其不希望看到一个轮廓的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的观察,这是一个糟糕的设计。如何“坚持下去”是真的吗?如果这是一件政治事情,我为你感到难过。但从技术角度来看,使用模板将其重构为真正的选项卡控件应该非常容易。
谢谢Ray,这个解决方法解决了问题中提到的问题。还要感谢您和Will的设计建议。我已经在竞选'不烂'的设计。 – Stewbob 2010-11-19 18:43:45