WPF的BooleanToVisibilityConverter在为false时转换为Hidden而不是Collapsed?

11 浏览
0 Comments

WPF的BooleanToVisibilityConverter在为false时转换为Hidden而不是Collapsed?

有没有办法在使用现有的WPF BooleanToVisibilityConverter转换器时,将False值转换为Hidden而不是默认的Collapsed,或者我应该自己编写一个?我在一个项目中,这样简单的事情会产生很大的开销(共享的内容会放在一个单独的解决方案中,重新构建/提交/合并的过程非常复杂),所以我更希望能够向现有的转换器传递一个参数,而不是去应对刚刚提到的困境。

0
0 Comments

问题:如何创建一个WPF BooleanToVisibilityConverter,当值为false时,将Visibility属性设置为Hidden而不是Collapsed?

原因:在WPF中,默认情况下,当将Visibility属性设置为Collapsed时,元素会在布局中不占用空间。但是,有些情况下,我们希望元素在布局中占用空间,但是不可见。因此,我们需要创建一个自定义的BooleanToVisibilityConverter,将值为false时的Visibility属性设置为Hidden。

解决方法:可以使用一个样式(style)和触发器(trigger)来实现这个效果。在样式中,设置当绑定的属性值为false时,将Visibility属性设置为Hidden。

下面是一种实现方式:


需要自己提供绑定属性来指向布尔属性。

这种方式虽然可行,但是在XAML中添加大量的样式和触发器会使代码变得冗长,阅读起来困难。而且,每次都使用样式和触发器进行这种常见的转换也是比较浪费资源的。

另一种解决方法是使用DataTrigger而不是Trigger。这样可以避免上述提到的错误。

以上是关于如何创建一个WPF BooleanToVisibilityConverter,将值为false时的Visibility属性设置为Hidden而不是Collapsed的原因和解决方法。在处理大型项目时,根据具体情况选择合适的方法,以保持代码简洁和性能高效。

0
0 Comments

WPF BooleanToVisibilityConverter在将false转换为Collapsed而不是Hidden时出现了问题。根据提供的代码,问题出现在Convert方法的实现上。代码中的逻辑是将bool或bool?类型的值转换为Visibility.Visible或Visibility.Collapsed。

然而,代码中的(value is bool?)检查是不必要的。如果将可空bool作为参数传递,且该值已设置,则会自动将其转换为普通bool,并且第一个检查将成功。如果值未设置(即为null),则它将被视为对象,两个检查都将失败。

根据评论中的反馈,原始代码实际上将false转换为Hidden,而不是Collapsed。可能是因为之前的编辑错误地将代码更改为使用Hidden而不是Collapsed。

实际上,在.NET Core 3.1的WPF应用程序中,可以返回Visibility.Hidden。因此,解决方法是将代码中的以下行更改为返回Visibility.Hidden:

return (flag ? Visibility.Visible : Visibility.Hidden);

这样,当值为false时,将返回Visibility.Hidden。

0
0 Comments

问题出现的原因是需要一个将布尔值转换为可见性的转换器,当布尔值为false时,将其转换为Hidden而不是Collapsed。解决方法是创建一个实现IValueConverter接口的BoolToVisibilityConverter类,并在XAML中使用该转换器进行绑定。

以下是解决方法的代码:

[ValueConversion(typeof(bool), typeof(Visibility))]
public sealed class BoolToVisibilityConverter : IValueConverter
{
  public Visibility TrueValue { get; set; }
  public Visibility FalseValue { get; set; }
  public BoolToVisibilityConverter()
  {
    // set defaults
    TrueValue = Visibility.Visible;
    FalseValue = Visibility.Collapsed;
  }
  public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
  {
    if (!(value is bool))
      return null;
    return (bool)value ? TrueValue : FalseValue;    
  }
  public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
  {
    if (Equals(value, TrueValue))
      return true;
    if (Equals(value, FalseValue))
      return false;
    return null;
  }
}

在使用时,在XAML中配置一个满足需求的版本,如下所示:


  

然后在一个或多个绑定中使用它:


此解决方案不仅适用于隐藏/折叠的偏好设置,还适用于反转/否定效果。

需要注意的是,Silverlight用户必须删除[ValueConversion]声明,因为该属性不是Silverlight框架的一部分。虽然在WPF中不是必需的,但与内置转换器保持一致。

请注意,代码是在文本编辑器中键入的。如果发现错误,请让我知道,我会更新代码。

通过上述代码,问题的原因是需要一个将布尔值转换为可见性的转换器,并且解决方法是创建一个实现IValueConverter接口的BoolToVisibilityConverter类并在XAML中使用它进行绑定。

0