示例:WPF中使用Grid+Margin实现抽屉菜单效果

一、目的:演示在WPF中使用Grid+Margin实现抽屉菜单效果

二、效果:

三、步骤:

1、整体应用Grid布局:

       <Grid>

                                                        <Grid.ColumnDefinitions>
                                                            <ColumnDefinition Width="Auto"/>
                                                            <ColumnDefinition/>
                                                        </Grid.ColumnDefinitions>

<!--左侧菜单 -->

<!--右侧内容-->

 <Grid>

注意:第一列设置成Width="Auto"

2、右侧用ToggleButton控制显示与隐藏效果,在Checked和Unchecked事件用触发效果左侧内容的Margin属性

      <Grid>

                                                        <Grid.ColumnDefinitions>
                                                            <ColumnDefinition Width="Auto"/>
                                                            <ColumnDefinition/>
                                                        </Grid.ColumnDefinitions>

                                                        <!--左侧菜单-->
                                                        <StackPanel x:Name="sp_left" Background="{DynamicResource S.Brush.Accent}" Width="278">

                                                            <Image Width="150" Height="{TemplateBinding CaptionHeight}" Source="{TemplateBinding Logo}" HorizontalAlignment="Center" VerticalAlignment="Center" />

                                                            <local:LinkGroupExpander Style="{DynamicResource S.LinkGroupExpander.Accent}"
                                                        ItemsSource="{TemplateBinding LinkActionGroups}" 
                                                        SelectedLink="{Binding RelativeSource={RelativeSource
                                                                Mode=TemplatedParent},Path=CurrentLink,Mode=TwoWay}"/>
                                                        </StackPanel>

                                                        <!--右侧区域-->
                                                        <Grid Grid.Column="1">
                                                            <Grid.RowDefinitions>
                                                                <RowDefinition Height="Auto"/>
                                                                <RowDefinition/>
                                                            </Grid.RowDefinitions>
                                                            
                                                            <!--右侧抬头-->
                                                            <Grid  x:Name="PART_TITLEGRID" Background="Transparent" Height="{TemplateBinding CaptionHeight}" Margin="0,2,2,0">

                                                                <!--隐藏菜单按钮-->
                                                                <ToggleButton  Content="&#xeb3a;"  Style="{DynamicResource S.ToggleButton.DoubleFIconChecked}" 
                                              IsTabStop="False" base:ControlAttachProperty.FIconSize="35" IsChecked="true"
                                                          base:ControlAttachProperty.FIcon="&#xe9ce;" HorizontalAlignment="Left" Margin="10,0"     
                                              base:ControlAttachProperty.AllowsAnimation="{Binding RelativeSource={RelativeSource Mode=Self},Path=IsChecked}">
                                                                    <base:Interaction.Triggers>
                                                                        <base:EventTrigger EventName="Checked">
                                                                            <base:InvokeCommandAction Command="{x:Static local:CommandService.VisibleOfMarginLeftCommand}" CommandParameter="{Binding ElementName=sp_left}"/>
                                                                        </base:EventTrigger>

                                                                        <base:EventTrigger EventName="Unchecked">
                                                                            <base:InvokeCommandAction Command="{x:Static local:CommandService.CollapsedOfMarginLeftCommand}" CommandParameter="{Binding ElementName=sp_left}"/>
                                                                        </base:EventTrigger>
                                                                    </base:Interaction.Triggers>
                                                                </ToggleButton>
                                                                
                                                            </Grid>
                                                        </Grid>
                                                    </Grid>

其中修改Margin属性的动画被封装在自定义Command里面,用于方便调用,代码如下:

    /// <summary> 向左侧隐藏区域 </summary>
    public class CollapsedOfMarginLeftCommand : ICommand
    {
        public bool CanExecute(object parameter)
        {
            return true;
        }

        public void Execute(object parameter)
        {
            if (parameter is FrameworkElement element)
            {
                ThicknessAnimation marginAnimation = new ThicknessAnimation();
                marginAnimation.From = new Thickness(0, 0, 0, 0);
                marginAnimation.To = new Thickness(-element.ActualWidth, 0, 0, 0);
                marginAnimation.Duration = TimeSpan.FromSeconds(0.5);
                //marginAnimation.Completed += (l, k) =>
                //  {
                //      element.Visibility = Visibility.Hidden;
                //  };
                element.BeginAnimation(FrameworkElement.MarginProperty, marginAnimation);

            }
        }

        public event EventHandler CanExecuteChanged;
    }

    /// <summary> 向右侧显示区域 </summary>

    public class VisibleOfMarginLeftCommand : ICommand
    {
        public bool CanExecute(object parameter)
        {
            return true;
        }

        public void Execute(object parameter)
        {
            if (parameter is FrameworkElement element)
            {
                //element.Visibility = Visibility.Visible;
                ThicknessAnimation marginAnimation = new ThicknessAnimation();
                marginAnimation.From = new Thickness(-element.ActualWidth, 0, 0, 0);
                marginAnimation.To = new Thickness(0, 0, 0, 0);
                marginAnimation.Duration = TimeSpan.FromSeconds(0.5);
                element.BeginAnimation(FrameworkElement.MarginProperty, marginAnimation);

            }
        }

        public event EventHandler CanExecuteChanged;
    }

四、下载地址:

https://github.com/HeBianGu/WPF-ControlBase.git

  

需要了解的知识点

System.Windows.Controls 命名空间 | Microsoft Learn

了解更多

GitHub - HeBianGu/WPF-ControlDemo: 示例

GitHub - HeBianGu/WPF-ControlBase: Wpf封装的自定义控件资源库

GitHub - HeBianGu/WPF-Control: WPF轻量控件和皮肤库

System.Windows.Controls 命名空间 | Microsoft Learn

HeBianGu (HeBianGu) · GitHub

HeBianGu的个人空间-HeBianGu个人主页-哔哩哔哩视频

 

在Windows Presentation Foundation (WPF) 中,使用 `Grid` 和 `Margin` 属性可以轻松地创建抽屉菜单(也称为侧边栏或导航面板)的效果。以下是一种常见的实现步骤: 1. **网格布局**: - 创建一个 `Grid` 控件作为容器,通常将它设置为窗口或控件的主要内容区域。 - `Grid` 可以有两列或三列布局,一列用于主内容区,另一列或第三列用于抽屉菜单。 ```xml <Grid> <Grid.ColumnDefinitions> <ColumnDefinition Width="Auto" /> <ColumnDefinition Width="*" /> <!-- 主内容区域 --> <ColumnDefinition Width="Auto" /> <!-- 抽屉菜单区域 --> </Grid.ColumnDefinitions> </Grid> ``` 2. **抽屉菜单**: - 在第二列(宽度为星号(*))中添加一个 `DockPanel` 或者直接使用 `Border` 并设置 `Visibility` 为 `Collapsed` 来隐藏初始状态下的抽屉。 - 使用 `Button`、`MenuItem` 或者自定义控件填充抽屉内容,并通过 `IsOpen` 或类似属性控制其可见性。 ```xml <!-- 抽屉菜单 --> <Border Grid.Column="2" Visibility="{Binding IsMenuOpen, Mode=TwoWay}"> <StackPanel Orientation="Vertical"> <MenuItem Header="菜单项1" /> <MenuItem Header="菜单项2" /> <!-- 更多菜单项... --> </StackPanel> </Border> ``` 3. **交互逻辑**: - 当需要打开抽屉时,改变 `IsMenuOpen` 的值,例如在点击按钮事件处理程序中设置为 `true`,触发数据绑定更新视图。 - 可能会配合动画效果,当 `IsMenuOpen` 从 `false` 到 `true` 的变化时,使用 `Storyboard` 或 ` easing` 动画来平滑过渡。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值