0

「折りたたんで開いた」ときに他のコントロールの上にコンテンツを表示する(ユーザー/カスタム)コントロールを作成する必要があります。

ポップアップ、コンボ、またはメニューと同様ですが、コンテンツは引き続き開きます(トグルボタンスタイルを考えてください)。

リードはありますか?

4

2 に答える 2

4

多くの問題に依存します。

私はそれを達成するための少なくとも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>

あなたの問題を解決する方法は他にもたくさんあると思います!

于 2012-09-21T14:16:35.433 に答える
2

簡略化された説明。

メインフォーム

<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;
    }
  }
于 2012-09-24T11:28:49.317 に答える