WPF界面侧边栏弹窗效果

因界面设计需要做一个侧边栏弹出的效果,目前接触到以下几种简单的实现方式

方式一:利用动画效果做控件的平移动画

涉及到如下知识(此处仅仅针对本项目中的需求简单介绍用法,详细关于wpf动画设计的自行百度学习)

Storyboard:

故事板,可用来分组多个动画,而且具有控制动画播放的能力。暂停、停止以及改变播放位置。

DoubleAnimationUsingKeyFrames:

按照一组 KeyFrames对 Double 的值进行动画处理。

RenderTransform:

WPF中的变形(RenderTransform)类是为了达到直接去改变某个Silverlight对象的形状(比如缩放、旋转一个元素)的目的而设计的,RenderTransform包含的变形属性成员就是专门用来改变Silverlight对象形状的,它可以实现对元素拉伸,旋转,扭曲等效果,同时变形特效也常用于辅助产生各种动画效果。

Window.Triggers:

事件触发器响应属性变化或事件(如按钮的Click事件),并控制故事板。例如,为了开始动画,事件触发器必须开始故事板。

创建侧边栏的内容,此处用listview简单添加一些标签

   <ListView >
       <ListViewItem Height="45" Padding="0">
           <TextBlock Text="Recycle" Margin="10"/>
       </ListViewItem>
       <ListViewItem Height="45" Padding="0">
           <TextBlock Text="Help" Margin="10"/>
       </ListViewItem>
       <ListViewItem Height="45" Padding="0">
           <TextBlock Text="Send Feedback" Margin="10"/>
       </ListViewItem>
       <ListViewItem Height="45" Padding="0">
           <TextBlock Text="Recommend" Margin="10"/>
       </ListViewItem>
       <ListViewItem Height="45" Padding="0">
           <TextBlock Text="Premium Subscription" Margin="10"/>
       </ListViewItem>
       <ListViewItem Height="45" Padding="0">
           <TextBlock Text="Settings" Margin="10"/>
       </ListViewItem>
   </ListView>

在空间布局中添加变换方式

           <Grid.RenderTransform>
                <TransformGroup>
                    <ScaleTransform/>
                    <SkewTransform />
                    <RotateTransform/>
                    <TranslateTransform/>
                </TransformGroup>
            </Grid.RenderTransform>

在静态资源中添加故事板

添加打开和关闭菜单两种故事板,添加开始和结束两个关键帧

<Storyboard x:Key="CloseMenu">
            <DoubleAnimationUsingKeyFrames Storyboard.TargetProperty="(UIElement.RenderTransform).(TransformGroup.Children)[3].(TranslateTransform.X)" Storyboard.TargetName="需要创建动画的目标名">
                <EasingDoubleKeyFrame KeyTime="0" Value="250"/>
                <EasingDoubleKeyFrame KeyTime="0:0:0.5" Value="0"/>
            </DoubleAnimationUsingKeyFrames>
        </Storyboard>
        <Storyboard x:Key="OpenMenu">
            <DoubleAnimationUsingKeyFrames Storyboard.TargetProperty="(UIElement.RenderTransform).(TransformGroup.Children)[3].(TranslateTransform.X)" Storyboard.TargetName="需要创建动画的目标名">
                <EasingDoubleKeyFrame KeyTime="0" Value="0"/>
                <EasingDoubleKeyFrame KeyTime="0:0:0.5" Value="250"/>
            </DoubleAnimationUsingKeyFrames>
        </Storyboard>

添加触发器

控制故事板

<Window.Triggers>
        <EventTrigger RoutedEvent="ButtonBase.Click" SourceName="触发按钮名">
            <BeginStoryboard Storyboard="{StaticResource CloseMenu}"/>
        </EventTrigger>
        <EventTrigger RoutedEvent="ButtonBase.Click" SourceName="触发按钮名">
            <BeginStoryboard Storyboard="{StaticResource OpenMenu}"/>
        </EventTrigger>
    </Window.Triggers>

添加触发按钮即可


还有一种比较简单易懂的实现方式
直接在按钮内部实现故事板。

<BeginStoryboard>
<Storyboard x:Name="HideStackPanel">
    <DoubleAnimation  Storyboard.TargetName="需要创建动画的目标名"
     Storyboard.TargetProperty="Width"
     BeginTime="0:0:0"
     From="230" To="65"
     Duration="0:0:0.2">                                                
   </DoubleAnimation>
</Storyboard>
</BeginStoryboard>

方式二:利用materialDesign:DrawerHost的抽屉效果

涉及到以下知识:

materialDesign控件库

一款开源的wpf样式库和控件集,可以通过nuget直接获取,配置方法百度即可,此处不细说

DrawerHost组件

可以做一个抽屉效果

首先给项目添加materialDesign包,在app.xaml添加资源,在xaml添加引用(此步骤可自行百度)

在需要弹出抽屉的布局外侧包裹DrawerHost

<materialDesign:DrawerHost IsTopDrawerOpen="{Binding .cs文件中定义的绑定属性}" >
          <被弹窗覆盖的部分>
</materialDesign:DrawerHost>

在materialDesign:DrawerHost 内部添加弹窗内容

<materialDesign:DrawerHost IsTopDrawerOpen="{Binding .cs文件中定义的绑定属性}" >
 <materialDesign:DrawerHost.TopDrawerContent >
     <弹窗的具体内容在此定义>
 </materialDesign:DrawerHost.TopDrawerContent>
     <被弹窗遮盖的部分>
</materialDesign:DrawerHost>

方式三:用计时器定时改变控件宽度实现窗口弹出

这种实现方法比较原始,就是按钮开启定时器,在执行函数里改变控件宽度

涉及到以下知识

DispatcherTimer

DispatcherTimer 类的工作方式是指定一个时间间隔,然后订阅每次满足该时间间隔时将发生的Tick事件。在调用Start()方法或将IsEnabled属性设置为 true之前,不会启动 DispatcherTimer 。

在界面对应的后台代码.cs中的初始化函数中创建DispatcherTimer对象,指定时间间隔,订阅事件

public MainWindow()
        {
            InitializeComponent();
            timer = new DispatcherTimer();
            timer.Interval = new TimeSpan(0, 0, 0, 0, 10);
            timer.Tick += Timer_Tick;
        }

在事件函数中对窗口的宽度递减或递增

private void Timer_Tick(object sender, EventArgs e)
        {
            if (hidden)
            {
                sidePanel.Width += 2;
                if (sidePanel.Width >= panelWidth)
                {
                    timer.Stop();
                    hidden = false;
                }
            }
            else
            {
                sidePanel.Width -= 2;
                if (sidePanel.Width <= 35)
                {
                    timer.Stop();
                    hidden = true;
                }
            }

        }

在对应的按钮响应函数中开启定时器即可

### 回答1: WPF是一种用于创建Windows桌面应用程序的框架,它提供了许多控件和功能来创建交互式界面。如果我们需要在WPF应用程序中自定义侧边导航,可以按照以下步骤进行操作: 1. 创建侧边导航的布局:可以使用WPF中的Grid或StackPanel控件来创建一个垂直的侧边导航栏,其中包含导航项的按钮或列表。 2. 设置导航项的样式:可以自定义按钮的外观,例如背景颜色、字体颜色和大小,以及按钮的左侧图标。使用WPF的Style和Trigger来设置按钮的不同状态下的外观效果,例如鼠标悬停或点击时的效果。 3. 绑定导航项到页面:在创建导航项的按钮或列表时,可以使用WPF的Command属性将导航命令与按钮或列表项的点击事件关联起来。这样,在用户点击导航项时,将触发相应的命令并导航到对应的页面。 4. 创建页面内容:根据导航项的点击事件,我们可以在主窗口的内容区域加载不同的页面内容。可以使用WPF中的Frame控件来承载页面内容,并使用不同的页面来填充Frame控件,以实现导航功能。 5. 设计页面导航逻辑:可以在应用程序中设计导航逻辑,例如在导航到不同页面时进行权限验证、显示页面切换动画等。使用WPF的Page和Frame控件配合使用,可以实现页面之间的无缝切换和导航。 通过以上步骤,我们可以在WPF应用程序中自定义一个侧边导航,使用户能够方便地切换不同的页面内容。这样的自定义侧边导航可以提升用户体验,并增加应用程序的交互性。 ### 回答2: WPF是一种用于创建Windows桌面应用程序的技术,它允许开发者使用XAML语言和C#或VB.NET代码来构建用户界面。在WPF中,可以自定义侧边导航以提供更好的用户体验。 要创建自定义的侧边导航,首先需要在WPF窗口中添加一个导航栏容器,可以使用StackPanel或WrapPanel等控件。然后,可以在导航栏容器中添加按钮或菜单项,用于作为导航的选项。 接下来,为每个导航选项创建一个页面。页面可以通过使用WPF的Page或UserControl来创建。可以为页面添加标识符或属性来表示其对应的导航选项。 然后,在侧边导航的按钮或菜单项的点击事件中,使用导航框架(如Frame或NavigationWindow)加载对应的页面。导航框架将负责显示和管理页面的导航。 为了提供更好的用户体验,可以为选中的导航选项添加高亮效果,以便用户知道当前所在的导航选项。可以使用样式或触发器来实现这一效果。 此外,还可以根据需要添加额外的功能,如在导航选项上添加图标或说明文本,或者使用动画效果来改善导航的过渡效果。 总结起来,自定义WPF侧边导航需要在WPF窗口中添加导航栏容器,创建导航选项和相应的页面,使用导航框架进行页面的导航,为选中的导航选项添加高亮效果,并根据需要添加其他功能来提升用户体验。通过这些步骤,可以实现一个自定义的侧边导航,为应用程序提供直观和简洁的导航界面。 ### 回答3: WPF是Windows Presentation Foundation的缩写,是一种用于创建Windows桌面应用程序的.NET框架。WPF提供了丰富的可视化元素和灵活的布局系统,使开发者能够构建功能强大、交互性强的应用程序。 自定义侧边导航是WPF中常见的需求之一,可以通过以下步骤实现: 首先,创建一个主窗口容器,可以使用Grid或其他适当的布局容器。在主窗口的侧边位置放置一个StackPanel作为导航栏容器。 然后,通过创建自定义的UserControl来表示每个导航条目。在这个UserControl中,可以添加一个Button来表示条目的按钮,并将其样式设置为适当的样式。还可以添加一个TextBlock或其他适当的元素来显示条目的标题。 在主窗口容器的侧边导航栏StackPanel中,使用多个自定义的导航条目UserControl来表示不同的导航选项。可以通过设置每个导航条目UserControl的属性来设置其显示的标题和按钮样式。 在导航条目的按钮的Click事件中,可以在主窗口中的内容区域切换不同的页面。可以使用Frame或其他适当的控件作为内容区域容器,并将其导航源设置为所需的页面。 最后,根据需要可以添加一些动画效果或交互功能来增强侧边导航的用户体验。例如,可以在导航条目被选中时,修改按钮样式或显示选中状态的指示。 总之,通过创建自定义的UserControl来表示每个导航条目,并在主窗口中的内容区域动态切换页面,可以实现WPF中的自定义侧边导航。这样用户就可以通过点击导航栏中的按钮来方便地浏览和切换不同的页面内容。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值