25

我想使用 WPFToggleButton来展开和折叠我的应用程序中的一些控件。如何使用 XAML 来完成此任务?

我在想我可以以某种方式将Visibility某些控件的属性绑定到ToggleButton'IsChecked状态,但我不知道该怎么做。

也许我需要给我ToggleButton的 a Name,然后使用绑定ElementName?然后我需要一个ValueConverter用于在布尔值和可见性之间进行转换,对吗?我怎么能ValueConverter为此目的制作一个通用的?

4

3 回答 3

45

您需要Visibility通过转换器绑定:

<Window
  x:Class="WpfApplication1.Window1"
  xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
  <Window.Resources>
    <BooleanToVisibilityConverter x:Key="BooleanToVisibilityConverter"/>
  </Window.Resources>
  <StackPanel>
    <ToggleButton x:Name="toggleButton" Content="Toggle"/>
    <TextBlock
      Text="Some text"
      Visibility="{Binding IsChecked, ElementName=toggleButton, Converter={StaticResource BooleanToVisibilityConverter}}"/>
  </StackPanel>
</Window>

在 Silverlight 中没有BooleanToVisibilityConverter,但很容易通过一些附加功能编写您自己的:

using System;
using System.Globalization;
using System.Windows;
using System.Windows.Data;

namespace WpfApplication1 {

  public class BooleanToVisibilityConverter : IValueConverter {

    public Object Convert(Object value, Type targetType, Object parameter, CultureInfo culture) {
      if (targetType == typeof(Visibility)) {
        var visible = System.Convert.ToBoolean(value, culture);
        if (InvertVisibility)
          visible = !visible;
        return visible ? Visibility.Visible : Visibility.Collapsed;
      }
      throw new InvalidOperationException("Converter can only convert to value of type Visibility.");
    }

    public Object ConvertBack(Object value, Type targetType, Object parameter, CultureInfo culture) {
      throw new InvalidOperationException("Converter cannot convert back.");
    }

    public Boolean InvertVisibility { get; set; }

  }

}

现在您可以指定一个映射trueCollapsedfalse到的转换器Visible

<BooleanToVisibilityConverter
  x:Key="InverseBooleanToVisibilityConverter" InvertVisibility="True"/>
于 2009-10-07T21:27:04.020 回答
8

使用 BooleanToVisibilityConverter:

<BooleanToVisibilityConverter x:Key="bvc" />
<TextBlock Visibility="{Binding IsChecked, ElementName=toggle, Converter={StaticResource bvc}}" />
于 2009-10-07T21:20:18.697 回答
0

您是否有理由不只是使用Expander?无论如何,它都是基于 ToggleButton 的。

于 2009-10-07T21:12:27.357 回答