WPF气泡样式弹窗效果代码分享

页面设计需求,做了一个气泡形状的弹出框,效果如下:

设计思路如下:

1. 使用Path绘制气泡的尖尖,将这个放到顶层;

2. 在用border绘制长方形框,将这个放到底层,并且设置Margin值,使得Path图层和border看起来衔接在一起。

代码如下:

<Window x:Class="BubblePanelTest.MainWindow"
  xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
  Title="MainWindow" Height="350" Width="525">
 <Window.Resources>
  <Style TargetType="Label" x:Key="TopBubblePanel">
   <Setter Property="Template">
    <Setter.Value>
     <ControlTemplate TargetType="{x:Type Label}">
      <Grid>
       <Border CornerRadius="4" BorderBrush="Black" BorderThickness="1" VerticalAlignment="Top" Background="Yellow" HorizontalAlignment="Left" Margin="0,8.5,0,0" Padding="5">
        <ContentPresenter />
       </Border>
       <Canvas Width="10" Height="10" HorizontalAlignment="Left" VerticalAlignment="Top" Margin="10,0,0,0" Background="Transparent">
        <Path Stroke="Black" StrokeThickness="0.5" Fill="Yellow">
         <Path.Data>
          <PathGeometry Figures="M 0,10
         L 0,10,5,0
         L 5,0,10,10
         "/>
         </Path.Data>
        </Path>
       </Canvas>
      </Grid>
     </ControlTemplate>
    </Setter.Value>
   </Setter>
  </Style>
  <Style TargetType="Label" x:Key="BottomBubblePanel">
   <Setter Property="Template">
    <Setter.Value>
     <ControlTemplate TargetType="{x:Type Label}">
      <Grid>
       <Border CornerRadius="4" BorderBrush="Black" BorderThickness="1" VerticalAlignment="Bottom" Margin="0,0,0,8.5" Background="Yellow" HorizontalAlignment="Left" Padding="5">
        <ContentPresenter />
       </Border>
       <Canvas Width="10" Height="10" HorizontalAlignment="Left" VerticalAlignment="Bottom" Margin="10,0,0,0" Background="Transparent">
        <Path Stroke="Black" StrokeThickness="0.5" Fill="Yellow">
         <Path.Data>
          <PathGeometry Figures="M 0,0
         L 0,0,5,10
         L 5,10,10,0
         "/>
         </Path.Data>
        </Path>
       </Canvas>
      </Grid>
     </ControlTemplate>
    </Setter.Value>
   </Setter>
  </Style>
  <Style TargetType="Label" x:Key="LeftBubblePanel">
   <Setter Property="Template">
    <Setter.Value>
     <ControlTemplate TargetType="{x:Type Label}">
      <Grid>
       <Border CornerRadius="4" BorderBrush="Black" BorderThickness="1" VerticalAlignment="Top" Margin="8.5,0,0,0" Background="Yellow" HorizontalAlignment="Left" Padding="5">
        <ContentPresenter />
       </Border>
       <Canvas Width="10" Height="10" HorizontalAlignment="Left" VerticalAlignment="Top" Margin="0,10,0,0" Background="Transparent">
        <Path Stroke="Black" StrokeThickness="0.5" Fill="Yellow">
         <Path.Data>
          <PathGeometry Figures="M 10,0
         L 10,0,0,5
         L 0,5,10,10
         "/>
         </Path.Data>
        </Path>
       </Canvas>
      </Grid>
     </ControlTemplate>
    </Setter.Value>
   </Setter>
  </Style>
  <Style TargetType="Label" x:Key="RightBubblePanel">
   <Setter Property="Template">
    <Setter.Value>
     <ControlTemplate TargetType="{x:Type Label}">
      <Grid HorizontalAlignment="Left">
       <Border CornerRadius="4" BorderBrush="Black" BorderThickness="1" HorizontalAlignment="Right" VerticalAlignment="Top" Margin="0,0,8.5,0" Background="Yellow" Padding="5">
        <ContentPresenter />
       </Border>
       <Canvas Width="10" Height="10" HorizontalAlignment="Right" VerticalAlignment="Top" Margin="0,10,0,0" Background="Transparent">
        <Path Stroke="Black" StrokeThickness="0.5" Fill="Yellow">
         <Path.Data>
          <PathGeometry Figures="M 0,0
         L 0,0,10,5
         L 10,5,0,10
         "/>
         </Path.Data>
        </Path>
       </Canvas>
      </Grid>
     </ControlTemplate>
    </Setter.Value>
   </Setter>
  </Style>
 </Window.Resources>
 <StackPanel>
  <Label Style="{StaticResource TopBubblePanel}" Tag="Top" Margin="2">
   <StackPanel>
    <StackPanel Orientation="Horizontal">
     <TextBlock Text="abc" />
     <TextBox Width="80"/>
    </StackPanel>
   </StackPanel>
  </Label>
  <Label Style="{StaticResource BottomBubblePanel}" Tag="Top" Margin="2">
   <StackPanel>
    <StackPanel Orientation="Horizontal">
     <TextBlock Text="abc" />
     <TextBox Width="80"/>
    </StackPanel>
   </StackPanel>
  </Label>
  <Label Style="{StaticResource LeftBubblePanel}" Tag="Top" Margin="2">
   <StackPanel>
    <StackPanel Orientation="Horizontal">
     <TextBlock Text="abc" />
     <TextBox Width="80"/>
    </StackPanel>
   </StackPanel>
  </Label>
  <Label Style="{StaticResource RightBubblePanel}" Tag="Top" Margin="2">
   <StackPanel>
    <StackPanel Orientation="Horizontal">
     <TextBlock Text="abc" />
     <TextBox Width="80"/>
    </StackPanel>
   </StackPanel>
  </Label>
  <StackPanel Orientation="Horizontal" Margin="0,30,0,0">
   <Button Name="btnTestPopup1" Width="100" Height="30" Content="Bottom" Click="btnTestPopup1_Click" />
   <Button Name="btnTestPopup2" Width="100" Height="30" Content="Top" Click="btnTestPopup2_Click" />
   <Button Name="btnTestPopup3" Width="100" Height="30" Content="Right" Click="btnTestPopup3_Click" />
   <Button Name="btnTestPopup4" Width="100" Height="30" Content="Left" Click="btnTestPopup4_Click" />
  </StackPanel>
  <Popup Name="pop1" AllowsTransparency="True" StaysOpen="False" PopupAnimation="Slide" PlacementTarget="{Binding ElementName=btnTestPopup1}" Placement="Bottom" >
   <Label Style="{StaticResource TopBubblePanel}" Tag="Top">
    <StackPanel>
     <StackPanel Orientation="Horizontal">
      <TextBlock Text="abc" />
      <TextBox Width="80" Name="txtTest1" />
     </StackPanel>
     <StackPanel Orientation="Horizontal" HorizontalAlignment="Right">
      <Button Content="确定" Click="btnOK1_Click" Width="50" Height="25" Margin="5" />
      <Button Content="取消" Click="btnCancel1_Click" Width="50" Height="25" Margin="5"/>
     </StackPanel>
    </StackPanel>
   </Label>
  </Popup>
  <Popup Name="pop2" AllowsTransparency="True" StaysOpen="False" PopupAnimation="Fade" PlacementTarget="{Binding ElementName=btnTestPopup2}" Placement="Top" >
   <Label Style="{StaticResource BottomBubblePanel}" Tag="Top">
    <StackPanel>
     <StackPanel Orientation="Horizontal">
      <TextBlock Text="abc" />
      <TextBox Width="80" Name="txtTest2" />
     </StackPanel>
     <StackPanel Orientation="Horizontal" HorizontalAlignment="Right">
      <Button Content="确定" Click="btnOK2_Click" Width="50" Height="25" Margin="5"/>
      <Button Content="取消" Click="btnCancel2_Click" Width="50" Height="25" Margin="5"/>
     </StackPanel>
    </StackPanel>
   </Label>
  </Popup>
  <Popup Name="pop3" AllowsTransparency="True" StaysOpen="False" PopupAnimation="Scroll" PlacementTarget="{Binding ElementName=btnTestPopup3}" Placement="Right" >
   <Label Style="{StaticResource LeftBubblePanel}" Tag="Top">
    <StackPanel>
     <StackPanel Orientation="Horizontal">
      <TextBlock Text="abc" />
      <TextBox Width="80" Name="txtTest3" />
     </StackPanel>
     <StackPanel Orientation="Horizontal" HorizontalAlignment="Right">
      <Button Content="确定" Click="btnOK2_Click" Width="50" Height="25" Margin="5"/>
      <Button Content="取消" Click="btnCancel3_Click" Width="50" Height="25" Margin="5"/>
     </StackPanel>
    </StackPanel>
   </Label>
  </Popup>
  <Popup Name="pop4" AllowsTransparency="True" StaysOpen="False" PopupAnimation="None" PlacementTarget="{Binding ElementName=btnTestPopup4}" Placement="Left" >
   <Label Style="{StaticResource RightBubblePanel}" Tag="Top">
    <StackPanel>
     <StackPanel Orientation="Horizontal">
      <TextBlock Text="abc" />
      <TextBox Width="80" Name="txtTest4" />
     </StackPanel>
     <StackPanel Orientation="Horizontal" HorizontalAlignment="Right">
      <Button Content="确定" Click="btnOK4_Click" Width="50" Height="25" Margin="5"/>
      <Button Content="取消" Click="btnCancel4_Click" Width="50" Height="25" Margin="5"/>
     </StackPanel>
    </StackPanel>
   </Label>
  </Popup>
 </StackPanel>
</Window>

后台代码,很简单,就是控制pupup显示或隐藏

private void btnTestPopup1_Click(object sender, RoutedEventArgs e)
  {
   pop1.IsOpen = true;
  }
  private void btnOK1_Click(object sender, RoutedEventArgs e)
  {
   pop1.IsOpen = false;
  }
  private void btnCancel1_Click(object sender, RoutedEventArgs e)
  {
   pop1.IsOpen = false;
  }

  private void btnTestPopup2_Click(object sender, RoutedEventArgs e)
  {
   pop2.IsOpen = true;
  }
  private void btnOK2_Click(object sender, RoutedEventArgs e)
  {
   pop2.IsOpen = false;
  }
  private void btnCancel2_Click(object sender, RoutedEventArgs e)
  {
   pop2.IsOpen = false;
  }

  private void btnTestPopup3_Click(object sender, RoutedEventArgs e)
  {
   pop3.IsOpen = true;
  }
  private void btnOK3_Click(object sender, RoutedEventArgs e)
  {
   pop3.IsOpen = false;
  }
  private void btnCancel3_Click(object sender, RoutedEventArgs e)
  {
   pop3.IsOpen = false;
  }

  private void btnTestPopup4_Click(object sender, RoutedEventArgs e)
  {
   pop4.IsOpen = true;
  }
  private void btnOK4_Click(object sender, RoutedEventArgs e)
  {
   pop4.IsOpen = false;
  }
  private void btnCancel4_Click(object sender, RoutedEventArgs e)
  {
   pop4.IsOpen = false;
  }

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • 超炫酷的WPF实现Loading控件效果

    Win8系统的Loading效果还是很不错的,网上也有人用CSS3等技术实现,研究了一下,并打算用WPF自定义一个Loading控件实现类似的效果,并可以让用户对Loading的颗粒(Particle)背景颜色进行自定义,话不多说,直接上代码: 1.用VS2012新建一个WPF的用户控件库项目WpfControlLibraryDemo,VS自动生成如下结构: 2.删除UserControl1.xaml,并新建一个Loading的CustomControl(不是UserControl),如下图所示

  • C#微信公众号开发之接收事件推送与消息排重的方法

    本文实例讲述了C#微信公众号开发之接收事件推送与消息排重的方法.分享给大家供大家参考.具体分析如下: 微信服务器在5秒内收不到响应会断掉连接,并且重新发起请求,总共重试三次.这样的话,问题就来了.有这样一个场景:当用户关注微信账号时,获取当前用户信息,然后将信息写到数据库中.类似于pc端网站的注册.可能由于这个关注事件中,我们需要处理的业务逻辑比较复杂.如送积分啊,写用户日志啊,分配用户组啊.等等--一系列的逻辑需要执行,或者网络环境比较复杂,无法保证5秒内响应当前用户的操作,那如果当操作尚未完

  • WPF实现渐变淡入淡出的登陆窗口效果

    本文实例讲述了WPF实现渐变淡入淡出的登陆窗口效果的方法.分享给大家供大家参考.具体实现方法如下: 1.实现原理 ① 利用UIElement.OpacityMask属性,用于改变对象区域的不透明度的画笔.可以使元素的特定区域透明或部分透明,从而实现比较新颖的效果. ② OpacityMask属性接受任何画刷,可利用LinearGradientBrush线性渐变画刷,通过对渐变画刷中各颜色点加以动画处理即可. 2.渐变淡入实现 渐变淡入效果,可通过事件触发器触发Loaded事件实现,所以可以仅用前

  • WPF微信聊天和通讯录按钮样式代码分享

    一.先用Path画一下轮廓 <Path Stroke="Red" StrokeThickness="1" Margin="10" StrokeDashCap="Round"> <Path.Data> <GeometryGroup> <PathGeometry Figures="M 4,40 A 16,13 0 1 1 10,45 L 3,48 Z" /> &l

  • C#开发微信公众号接口开发

    具体实现方式不多说了,请看下文 一.前言 当下微信公众号几乎已经是每个公司必备的,但是大部分微信公众账号用户体验都欠佳,特别是涉及到用户绑定等,需要用户进行复杂的操作才可以和网站绑定,或者很多公司直接不绑定,而是每次都让用户填写账号密码.作为微信接口开发人员我们知道网页授权可以用作微信网页用作安全登录,带参数二维码的使用用作记录用户来源,模板消息用作购物消费等消息的通知,但是很少看到有综合利用这些高级接口做出体验比较好的公众账号,这里分享一些我开发的用户绑定和验证码的一些心得.所需要的接口有基础

  • c#使用微信接口开发微信门户应用

    微信应用如火如荼,很多公司都希望搭上信息快车,这个是一个商机,也是一个技术的方向,因此,有空研究下.学习下微信的相关开发,也就成为日常计划的重要事情之一了.本系列文章希望从一个循序渐进的角度上,全面介绍微信的相关开发过程和相关经验总结,希望给大家了解一下相关的开发历程.本随笔主要针对微信开发过程的前期准备和一些初始的工作的介绍. 在写下本文的之前一周时间里,我主要就是参考一些介绍文章以及微信公众平台的相关接口说明,并结合C#的代码开发,整理了自己公司的门户界面,实现了微信工作号的初步用户交互和信

  • C#实现微信公众号群发消息(解决一天只能发一次的限制)实例分享

    总体思路: 1.首先必须要在微信公众平台上申请一个公众号. 2.然后进行模拟登陆.(由于我对http传输原理和编程不是特别懂,在模拟登陆的地方,不是特别清楚,希望有大神指教) 3.模拟登陆后会获得一个token(令牌)和cookie. 4.因为模拟登陆后相当于就进入了微信公众平台,在这个里面就可以抓取到需要的数据,如公众好友的昵称,fakeId.其中的fakeid非常重要,因为传输数据必须要知道对方的fakeid. 5.知道对方的fakeid就可以进行数据的发送了. 这里是整个项目的源码下载:h

  • C#微信开发(服务器配置)

    小编对微信开发颇感兴趣,查阅了网上相关文章进行整理,方便大家一起学习. 1.注册帐号--填写服务器配置 在https://mp.weixin.qq.com/ 微信公众平台上注册帐号: 服务号是公司申请的微信公共账号,订阅号是个人申请的,个人权限比较少: 登录微信公众平台官网后,在公众平台后台管理页面 - 开发者中心页,点击"修改配置"按钮,填写服务器地址(URL).Token和EncodingAESKey,其中URL是开发者用来接收微信消息和事件 的接口URL.Token可由开发者可以

  • c#使用微信接口开发微信门户应用中微信消息的处理和应答

    微信应用如火如荼,很多公司都希望搭上信息快车,这个是一个商机,也是一个技术的方向,因此,有空研究下.学习下微信的相关开发,也就成为计划的安排事情之一了.本系列文章希望从一个循序渐进的角度上,全面介绍微信的相关开发过程和相关经验总结,希望给大家了解一下相关的开发历程.本篇随笔主要基于上一篇<c#使用微信接口开发微信门户应用>的基础上进行深入的介绍,介绍微信消息的处理和应答的过程. 1.微信的消息应答交互 我们知道,微信的服务器架起了客户手机和开发者服务器的一个桥梁,通过消息的传递和响应,实现了与

  • .Net语言Smobiler开发之如何仿微信朋友圈的消息样式

    最前面的话:Smobiler是一个在VS环境中使用.Net语言来开发APP的开发平台,也许比Xamarin更方便 一.目标样式 我们要实现上图中的效果,需要如下的操作: 1.从工具栏上的"Smobiler Components"拖动一个MicroBlog控件到窗体界面上 2.用代码添加手机界面上显示的内容 Load事件代码: VB: Private Sub TestMicroBlog_Load(sender As Object, e As EventArgs) Handles MyBa

随机推荐