「折りたたんで開いた」ときに他のコントロールの上にコンテンツを表示する(ユーザー/カスタム)コントロールを作成する必要があります。
ポップアップ、コンボ、またはメニューと同様ですが、コンテンツは引き続き開きます(トグルボタンスタイルを考えてください)。
リードはありますか?
「折りたたんで開いた」ときに他のコントロールの上にコンテンツを表示する(ユーザー/カスタム)コントロールを作成する必要があります。
ポップアップ、コンボ、またはメニューと同様ですが、コンテンツは引き続き開きます(トグルボタンスタイルを考えてください)。
リードはありますか?
多くの問題に依存します。
私はそれを達成するための少なくとも2つの方法を知っています。初使用<Popup />
。そのIsOpenプロパティを bool 変数にバインドするのは簡単です。また、閉じる必要がある場合は、いくつかのスマートな動作があります ( Escキーが押されたとき、またはフォーカスが失われたときにポップアップを閉じます)。
2 番目の方法は<ContentControl />
、スタイルを持ち、トリガーを持ち、必要に応じて ContentTemplate を変更することです。
<ContentControl Grid.Row="3" Grid.ColumnSpan="2" Grid.RowSpan="2" Content="{Binding}">
<ContentControl.Style>
<Style>
<Setter Property="ContentControl.ContentTemplate" Value="{StaticResource OneTemplate}"/>
<Style.Triggers>
<MultiDataTrigger>
<MultiDataTrigger.Conditions>
<Condition Binding="{Binding Property1}" Value="False"/>
<Condition Binding="{Binding Property2}" Value="True"/>
</MultiDataTrigger.Conditions>
<Setter Property="ContentPresenter.ContentTemplate" Value="{StaticResource TwoTemplate}"/>
</MultiDataTrigger>
</Style.Triggers>
</Style>
</ContentControl.Style>
</ContentControl>
あなたの問題を解決する方法は他にもたくさんあると思います!
簡略化された説明。
メインフォーム
<Window>
<StackPanel Orientation="Vertical">
<ToolButton StackPanel.ZIndex="999"/>
<TextBlock>Other content</TextBlock>
</StackPanel>
</Window>
オーバーフローしたコントロールが一番上にあることを示すには、ZIndex が必要です。
カスタム コントロール
<UserControl x:Class="ToolButton" Height="32">
<Canvas>
<ToggleButton x:Name="button">
<TextBlock>Content</TextBlock>
</ToggleButton>
<TextBlock Canvas.Top="32" Visibility="{Binding ElementName=button, Path=IsChecked, Converter={converter:BooleanToVisibility}}">Popup</TextBlock>
</Canvas>
</UserControl>
Bool から可視性へのコンバーター
public sealed class BooleanToVisibility : MarkupExtension, IValueConverter
{
public BooleanToVisibility() { }
public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
var flag = false;
if (value is bool)
{
flag = (bool)value;
}
else if (value is bool?)
{
var nullable = (bool?)value;
flag = nullable.GetValueOrDefault();
}
if (parameter != null)
{
if (bool.Parse((string)parameter))
{
flag = !flag;
}
}
if (flag)
{
return Visibility.Visible;
}
else
{
return Visibility.Collapsed;
}
}
public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
var back = ((value is Visibility) && (((Visibility)value) == Visibility.Visible));
if (parameter != null)
{
if ((bool)parameter)
{
back = !back;
}
}
return back;
}
public override object ProvideValue(IServiceProvider serviceProvider)
{
return this;
}
}