WPF ToggleButton
を使用して、アプリケーションの一部のコントロールを展開および縮小したいと思います。 XAMLを使用してこれを実現するにはどうすればよいですか?
どういうわけか、いくつかのコントロールのVisibility
属性をToggleButton
のIsChecked
状態にバインドできると思っていますが、これを行う方法がわかりません。
多分私はToggleButton
にName
を与え、次にElementName
を使用してバインドする必要がありますか?次に、ブール値と可視性の間で変換するためにValueConverter
が必要になりますよね?この目的でジェネリックValueConverter
を作成するにはどうすればよいですか?
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; }
}
}
これで、true
をCollapsed
にマップし、false
をVisible
にマップするコンバーターを指定できます。
<BooleanToVisibilityConverter
x:Key="InverseBooleanToVisibilityConverter" InvertVisibility="True"/>
BooleanToVisibilityConverterを使用します。
<BooleanToVisibilityConverter x:Key="bvc" />
<TextBlock Visibility="{Binding IsChecked, ElementName=toggle, Converter={StaticResource bvc}}" />
Expander を使用していない理由はありますか?とにかくToggleButtonに基づいています。