WPF弹出窗口控件很好,但在我看来有一定的局限性。有没有办法在弹出窗口打开时“拖动”它(就像使用窗口的DragMove()方法一样)?
这样做可以没有大问题吗?或者我必须自己编写一个替代popup类的类?谢谢
发布于 2008-10-21 15:07:33
没有用于PopUp的DragMove。这只是一个小工作,有很多改进,你可以添加到这一点。
<Popup x:Name="pop" IsOpen="True" Height="200" Placement="AbsolutePoint" Width="200">
<Rectangle Stretch="Fill" Fill="Red"/>
</Popup>
在后面的代码中,添加此mousemove事件
pop.MouseMove += new MouseEventHandler(pop_MouseMove);
void pop_MouseMove(object sender, MouseEventArgs e)
{
if (e.LeftButton == MouseButtonState.Pressed)
{
pop.PlacementRectangle = new Rect(new Point(e.GetPosition(this).X,
e.GetPosition(this).Y),new Point(200,200));
}
}
发布于 2011-11-02 14:39:26
实现这一点的另一种方法是将弹出窗口的位置设置为MousePoint。这使得弹出窗口最初出现在鼠标光标所在的位置。
然后,您可以使用Thumb或MouseMove事件来设置弹出窗口的HorizontalOffset & VerticalOffset。当用户拖动弹出式窗口时,这些属性会将弹出式窗口从其原始位置移开。
记住要将HorizontalOffset和VerticalOffset重置为零,以便下次使用弹出窗口!
发布于 2019-02-14 03:16:01
基于Jobi Joy的回答,我发现了一个可重用的解决方案,它允许你在现有控件/页面的xaml中作为控件添加,但由于它具有不同的作用域,因此无法添加为具有名称的Xaml。
[ContentProperty("Child")]
[DefaultEvent("Opened")]
[DefaultProperty("Child")]
[Localizability(LocalizationCategory.None)]
public class DraggablePopup : Popup
{
public DraggablePopup()
{
MouseDown += (sender, e) =>
{
Thumb.RaiseEvent(e);
};
Thumb.DragDelta += (sender, e) =>
{
HorizontalOffset += e.HorizontalChange;
VerticalOffset += e.VerticalChange;
};
}
/// <summary>
/// The original child added via Xaml
/// </summary>
public UIElement TrueChild { get; private set; }
public Thumb Thumb { get; private set; } = new Thumb
{
Width = 0,
Height = 0,
};
protected override void OnInitialized(EventArgs e)
{
base.OnInitialized(e);
TrueChild = Child;
var surrogateChild = new StackPanel();
RemoveLogicalChild(TrueChild);
surrogateChild.Children.Add(Thumb);
surrogateChild.Children.Add(TrueChild);
AddLogicalChild(surrogateChild);
Child = surrogateChild;
}
}
https://stackoverflow.com/questions/222029
复制相似问题