创建具有重叠内容的usercontrol

时间:2012-09-21 13:48:51

标签: wpf xaml wpf-controls

我需要制作一个(用户/自定义)控件,当'折叠打开'时显示内容而不是其他控件。

像弹出窗口,组合或菜单一样,但内容仍会打开(想想切换按钮样式)。

任何线索?

2 个答案:

答案 0 :(得分:4)

取决于很多问题。

我知道至少有两种方法可以实现它。首先 - 使用<Popup />。很容易将 IsOpen 属性绑定到bool变量。如果你需要关闭它,我有一些聪明的行为(当按下 Esc 键或失去焦点时关闭弹出窗口。)

第二种方法是让<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>

我相信存在更多可能的方法来解决您的问题!

答案 1 :(得分: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 to visibility Converter

  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;
    }
  }