浅谈WPF之Popup弹出层

在日常开发中,当点击某控件时,经常看到一些弹出框,停靠在某些页面元素的附近,但这些又不是真正的窗口,而是页面的一部分,那这种功能是如何实现的呢?今天就以一个简单的小例子,简述如何在WPF开发中,通过Popup实现鼠标点击弹出浮动停靠窗口,仅供学习分享使用,如有不足之处,还请指正。

什么是Popup?

Popup(弹出层),Popup 控件提供一种在单独窗口中显示内容的方法,该窗口相对于指定元素或屏幕坐标在当前应用程序窗口上浮动。  Popup控件通过IsOpen属性控制是否可见。 当可见时,IsOpen 属性设置为 true,否则为 false

创建Popup

在WPF程序开发中,Popup和其他控件一样,可以定义控件的内容,创建Popup示例如下所示:

<ToggleButton x:Name="TogglePopupButton" Height="30" Width="150" HorizontalAlignment="Left">
	<StackPanel>
		<TextBlock VerticalAlignment="Center" HorizontalAlignment="Center">
			<Run Text="是否状态切换? " />
			<Run Text="{Binding IsChecked, ElementName=TogglePopupButton}" />
		</TextBlock>
		<Popup Name="myPopup" IsOpen="{Binding IsChecked, ElementName=TogglePopupButton}">
			<Border BorderThickness="1">
				<TextBlock Name="myPopupText" Text="这是一段弹出内容" Background="LightBlue" Foreground="Blue" Padding="30"></TextBlock>
			</Border>
		</Popup>
	</StackPanel>
</ToggleButton>

 

注意:上述示例,当ToggleButton被选中时,弹出提示内容;当ToggleButton取消选中时,隐藏弹出层。主要是将Popup的IsOpen属性和ToggleButton的IsChecked属性进行绑定

示例截图效果如下所示:

Popup的行为

通过Popup的IsOpen属性,来控制弹出层的显示与隐藏,当打开或关闭 Popup 内容窗口时,将引发 Opened 和 Closed 事件。默认情况下,当IsOpen属性为true时,将一直处于打开状态,直到属性变为false。但是也可以通过StaysOpen属性设置来判断Popup是否处于focus状态而决定是否显示,当StaysOpen属性为false时,如果Popup失去焦点,将会隐藏。StaysOpen默认值为true

Popup动画

Popup控件,默认支持淡入,滑入等动画效果,可通过PopupAnimation属性进行设置,并且设置AllowsTransparency为true。除了之处默认的淡入,滑入等动画效果外,还可以通过自定义StoryBoard来实现动画。

<CheckBox x:Name="myCheckBox" Width="50" Height="50" HorizontalAlignment="Left" VerticalAlignment="Top"></CheckBox>
<Popup Grid.Column="0" IsOpen="{Binding ElementName=myCheckBox,Path=IsChecked}" PlacementTarget="{Binding ElementName=myCheckBox}" AllowsTransparency="True" PopupAnimation="Slide" HorizontalOffset="50" VerticalOffset="20" Margin="10" Width="200" Height="200">
	<Canvas Width="100" Height="100" Background="DarkBlue">
		<TextBlock TextWrapping="Wrap" Foreground="White" Text="旋转Popup" VerticalAlignment="Center" HorizontalAlignment="Center" Canvas.Top="40" Canvas.Left="18"></TextBlock>
	</Canvas>
</Popup>

 

上述示例,设置了Popup的两个属性【AllowsTransparency="True" PopupAnimation="Slide"】来实现Popup的滑入效果,如下所示:

定义Popup的位置

Popup作为弹出层,可以相对页面上的控件元素进行定位,也可以相关整个窗口进行定位

1. 通过PlacementTarget和Placement进行定位

PlacementTarget为Popup指定相对定位的目标对象。如果已设置 PlacementTarget 属性,则它指定目标对象。 如果未设置 PlacementTarget 并且 Popup 具有父级,则父级就是目标对象。 如果没有 PlacementTarget 值并且没有父级,则没有目标对象并且 Popup 相对于屏幕进行定位。Placement为枚举类型,常用的有Bottom,Top,Left,Right等,示例如下所示:

<Button x:Name="button1" Grid.Column="1" Width="120" Height="100" Content="目标对象"></Button>
<Popup IsOpen="True" PlacementTarget="{Binding ElementName=button1}" Placement="Bottom">
	<TextBlock FontSize="14" Background="LightGreen">底部</TextBlock>
</Popup>
<Popup IsOpen="True" PlacementTarget="{Binding ElementName=button1}" Placement="Top">
	<TextBlock FontSize="14" Background="LightGreen">顶部</TextBlock>
</Popup>
<Popup IsOpen="True" PlacementTarget="{Binding ElementName=button1}" Placement="Left">
	<TextBlock FontSize="14" Background="LightGreen">左侧</TextBlock>
</Popup>
<Popup IsOpen="True" PlacementTarget="{Binding ElementName=button1}" Placement="Right">
	<TextBlock FontSize="14" Background="LightGreen">右侧</TextBlock>
</Popup>

 

示例效果如下所示:

2. PlacementRectangle目标区域进行定位

除此之外,还可以通过PlacementRectangle设置目标区域

目标区域示例如下所示:

<StackPanel Orientation="Horizontal" Grid.Row="1">
 
	<Canvas Width="200" Height="100" Background="Red">
		<Rectangle Canvas.Top="30" Canvas.Left="30" Width="50" Height="50" Stroke="White" StrokeThickness="3"/>
		<Popup IsOpen="True" PlacementRectangle="30,30,30,50">
			<TextBlock FontSize="14" Background="Yellow" Width="140" TextWrapping="Wrap" Text="这是通过PlacementRectangle定位的Popup"></TextBlock>
		</Popup>
	</Canvas>
 
	<Canvas Width="200" Height="100" Background="Red" Margin="30,0,0,0">
		<Rectangle Canvas.Top="30" Canvas.Left="50" Width="50" Height="50" Stroke="White" StrokeThickness="3"/>
		<Popup IsOpen="True">
			<TextBlock FontSize="14" Background="Yellow" Width="140" TextWrapping="Wrap" Text="这是没有通过PlacementRectangle定位的Popup"></TextBlock>
		</Popup>
	</Canvas>
 
</StackPanel>

 

以上示例通过设置PlacementRectangle属性来目标区域【目标区域并不会真的可见】。没有设置则以父类Canvas进行停靠。如下所示

3. 通过HorizontalOffset 和 VerticalOffset设置偏移进行定位

不仅可以设置目标区域,还可以通过HorizontalOffset 和 VerticalOffset 属性使 Popup 从目标区域偏移等。

<Canvas Width="200" Height="200" Background="Yellow" Margin="20">
  <Popup IsOpen="True" Placement="Bottom"
         HorizontalOffset="20" VerticalOffset="20">
    <TextBlock FontSize="14" Background="#42F3FD">
      This is a popup.
    </TextBlock>
  </Popup>
</Canvas>

 

偏移示例,如下所示:

参考文档

在本篇文章中,主要参考官方文档,如下所示:

1. https://learn.microsoft.com/zh-cn/dotnet/desktop/wpf/controls/popup?view=netframeworkdesktop-4.8

以上就是浅谈WPF之Popup的全部内容,关于更多详细内容,可参考官方文档。希望能够一起学习,共同进步。

  • 13
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: 在WPF中,可以使用弹出窗口的方法来实现在点击按钮时弹出数字键盘的效果。具体实现步骤如下: 1. 首先在XAML中添加一个按钮,并给它命名,比如说"数字键盘"。 2. 接下来需要创建一个新的窗口来实现数字键盘的UI设计。可以使用WPF自带的Window类来创建。在窗口中添加数字键盘的UI元素,比如说数字按钮,小数点按钮等。 3. 然后在按钮的Click事件中,实例化数字键盘的窗口,并调用ShowDialog()方法弹出窗口。 4. 在数字键盘窗口的代码中,可以通过接收按钮的点击事件,获取到用户输入的数字,并将其传递回主窗口中的按钮。 5. 最后在主窗口按钮接收到数字后,可以通过改变按钮的文本等方式,将数字显示在按钮上。 需要注意的是,数字键盘窗口需要设置为模态窗口,这样在点击数字键盘的同时,主窗口中的UI操作会被暂停,直到数字键盘窗口关闭。这样可以确保数字键盘的输入值能够被正确地传递到主窗口中。 总的来说,实现在点击按钮弹出数字键盘的效果并不复杂,只需要通过WPF的窗体、控件等自带功能并结合自己的逻辑即可实现。 ### 回答2: 在WPF中,可以使用弹出式数字键盘来获取用户输入。为此,可以使用自定义控件或从按钮中触发Popup控件,显示数字键盘。 一种简单方法是在xaml中定义一个Popup控件,然后将数字键盘作为Popup的子元素。然后,在按钮的Click事件中触发弹出Popup控件,以显示数字键盘。 以下是示例代码: ``` <StackPanel> <Button Content="Open Keyboard" Click="OpenKeyboardClick" /> <Popup x:Name="NumberKeyboardPopup"> <Grid> <!--定义数字键盘--> </Grid> </Popup> </StackPanel> ``` 然后在事件代码中打开Popup控件: ``` private void OpenKeyboardClick(object sender, RoutedEventArgs e) { NumberKeyboardPopup.IsOpen = true; } ``` 这只是一个简单的示例,你可以根据自己的需求来自定义数字键盘和触发条件。 ### 回答3: 在WPF中,我们可以使用Popup和Grid控件来实现一个弹出数字键盘的功能。 首先,我们需要创建一个Button控件,用来触发打开数字键盘的事件。然后,我们需要创建一个Grid控件,并在其中添加数字键盘的按钮。为了使数字键盘可以弹出,我们需要使用Popup控件,在其中嵌入我们创建的数字键盘Grid控件。 接下来,我们需要在Button控件的Click事件中,将数字键盘Popup控件的IsOpen属性设置为True,以便弹出数字键盘。同时,我们也需要在数字键盘中的每个按钮的Click事件中,将对应的数字添加到我们希望进行操作的目标控件中。 最后,我们需要在数字键盘的“取消”按钮上,添加相应的Click事件,以便在点击该按钮时,关闭数字键盘Popup控件,在不需要使用数字键盘时可以将其关闭。 综上所述,我们可以通过Popup和Grid控件,结合Button控件的Click事件和数字键盘按钮的Click事件来实现在WPF中点击按钮弹出数字键盘的功能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

老码识途呀

写作不易,多谢支持

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值