WPF中在UserControl里Popup如何跟随窗体移动
时间: 2024-09-24 11:26:37 浏览: 75
C# 使用委托方式Usercontrol与主窗体进行消息传递
在WPF中,要在`UserControl`中让`Popup`跟随其所属的窗口(即窗口移动时,`Popup`也随之移动),你需要确保`Popup`的关联源(通常是一个按钮或者其他控件)绑定到了窗口实例,并且设置了一些特定的属性。以下是实现这一功能的基本步骤:
1. 首先,确保在`UserControl`中有一个可以触发`Popup`显示的控件,例如一个`Button`。给这个按钮添加一个点击事件处理器,当点击时打开`Popup`。
```xml
<Button Content="Show Popup" Command="{Binding ShowPopupCommand}" />
```
2. 创建一个`Command`,比如在`UserControl`的ViewModel中:
```csharp
public ICommand ShowPopupCommand { get; set; }
public MainWindow Owner { get; set; } // 将Owner设为窗口实例
public ViewModel(UserControl uc, MainWindow owner)
{
Owner = owner;
ShowPopupCommand = new RelayCommand(() => ShowPopup());
}
private void ShowPopup()
{
var popup = new Popup { Child = YourPopupContentHere };
popup.IsOpen = true;
popup StaysOpenOn_esc = true; // 确保_popup不会因按Esc关闭
popup.PlacementTarget = Owner; // 将popup绑定到窗口
popup.HorizontalOffset = -popup.Child.DesiredSize.Width / 2; // 让popup居中显示
popup.VerticalOffset = -popup.Child.DesiredSize.Height / 2;
}
```
3. 当窗口发生`Move`事件时,也需要更新`Popup`的位置,使其保持相对窗口的固定位置。这可以通过在窗口的`MouseMove`事件中完成:
```csharp
Owner.MouseMove += (_, args) =>
{
if (popup?.IsOpen == true)
{
popup.HorizontalOffset = Owner.ClientLeft + Owner.DesiredSize.Width / 2 - popup.Child.DesiredSize.Width / 2;
popup.VerticalOffset = Owner.ClientTop + Owner.DesiredSize.Height / 2 - popup.Child.DesiredSize.Height / 2;
}
};
```
现在,每次窗口移动,`Popup`都会相应地移动。如果窗口被最小化或关闭,记得在适当的地方清除`Popup`的关联。
阅读全文