tl;dr
您需要添加一个ConverterParameter
有价值的Visibility.Hidden
到绑定:
<Setter Property="Visibility" Value="{Binding Model.IsVisible, ConverterParameter={x:Static Visibility.Hidden}, Converter={StaticResource btvc}, Mode=TwoWay}"/>
转换器参数是Visibility
当布尔值是时返回false
, and Hidden
意味着可锚定被隐藏。
完整答案
如果我们看一下LayoutContent.Close()
,它被标记为注释:
请注意,通常锚点只是隐藏的(而不是关闭的)。默认情况下,当用户单击 X 按钮时,它仅隐藏内容。
所以这不应该被调用。查看堆栈跟踪,这是从以下位置调用的:
// LayoutItem class.
protected virtual void OnVisibilityChanged()
{
if (LayoutElement != null &&
Visibility == System.Windows.Visibility.Collapsed)
LayoutElement.Close();
}
据微软称,System.Windows.Visibility.Collapsed
意味着该项目不可见,并且在布局期间没有为其保留空间。这听起来就像我们单击时锚定对象发生的情况X
隐藏它们(这可能发生在视觉树上的某个地方)。但是为什么评论说这通常不是锚定对象所需要的呢?如果我们看一下LayoutAnchorableItem.OnVisibilityChanged()
:
protected override void OnVisibilityChanged()
{
if (_anchorable != null && _anchorable.Root != null)
{
if (_visibilityReentrantFlag.CanEnter)
{
using (_visibilityReentrantFlag.Enter())
{
if (Visibility == System.Windows.Visibility.Hidden)
_anchorable.Hide(false);
else if (Visibility == System.Windows.Visibility.Visible)
_anchorable.Show();
}
}
}
base.OnVisibilityChanged();
}
很明显 AvalonDock 使用Visibility.Hidden
值指示可定位对象已隐藏。 (这让我有点困惑,因为微软声明Hidden
隐藏元素但在布局中保留空间,这不是隐藏元素时锚定的行为方式。)那么为什么可见性是这样的Collapsed
代替Hidden
?答案就在于BoolToVisibilityConverter
.
public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
if (value is bool && targetType == typeof(Visibility))
{
bool val = (bool)value;
if (val)
return Visibility.Visible;
else
if (parameter != null && parameter is Visibility)
return parameter;
else
return Visibility.Collapsed;
}
// ...
}
除非参数类型Visibility
已通过,Visibility.Collapsed
当布尔值为假时使用。我们想要 false 的意思是Visibility.Hidden
所以我们将其设置为ConverterParameter
<Setter Property="Visibility" Value="{Binding Model.IsVisible, ConverterParameter={x:Static Visibility.Hidden}, Converter={StaticResource btvc}, Mode=TwoWay}"/>