gpt4 book ai didi

wpf - wpf 中的可拖动弹出控件

转载 作者:行者123 更新时间:2023-12-04 19:48:01 25 4
gpt4 key购买 nike

我在 wpf 中需要一个可拖动的弹出控件,想知道你们中的任何人是否可以帮助我……我确实看到了以下帖子:

Drag WPF Popup control

但这不是它应该如何工作......?当我单击并拖动它时,它总是重置到特定点,而且评论者说这不是一种有效的方法......?
有没有人有其他选择?

谢谢!

最佳答案

我们可以编写一个行为来使任何 Popup可拖动。以下是与文本框关联的弹出窗口的一些示例 XAML,该文本框在文本框聚焦时打开并保持打开状态:

<Grid>
<StackPanel>
<TextBox x:Name="textBox1" Width="200" Height="20"/>
</StackPanel>
<Popup PlacementTarget="{Binding ElementName=textBox1}" IsOpen="{Binding IsKeyboardFocused, ElementName=textBox1, Mode=OneWay}">
<i:Interaction.Behaviors>
<local:MouseDragPopupBehavior/>
</i:Interaction.Behaviors>
<TextBlock Background="White">
<TextBlock.Text>Sample Popup content.</TextBlock.Text>
</TextBlock>
</Popup>
</Grid>

这是允许我们拖动 Popup 的行为。 :
public class MouseDragPopupBehavior : Behavior<Popup>
{
private bool mouseDown;
private Point oldMousePosition;

protected override void OnAttached()
{
AssociatedObject.MouseLeftButtonDown += (s, e) =>
{
mouseDown = true;
oldMousePosition = AssociatedObject.PointToScreen(e.GetPosition(AssociatedObject));
AssociatedObject.Child.CaptureMouse();
};
AssociatedObject.MouseMove += (s, e) =>
{
if (!mouseDown) return;
var newMousePosition = AssociatedObject.PointToScreen(e.GetPosition(AssociatedObject));
var offset = newMousePosition - oldMousePosition;
oldMousePosition = newMousePosition;
AssociatedObject.HorizontalOffset += offset.X;
AssociatedObject.VerticalOffset += offset.Y;
};
AssociatedObject.MouseLeftButtonUp += (s, e) =>
{
mouseDown = false;
AssociatedObject.Child.ReleaseMouseCapture();
};
}
}

如果您不熟悉行为,请安装 Expression Blend 4 SDK 并添加以下命名空间:
xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity"

并添加 System.Windows.Interactivity到您的项目。

关于wpf - wpf 中的可拖动弹出控件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4784240/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com