Frage

die WPF-Popup-Steuerelement ist nett, aber etwas eingeschränkt in meiner Meinung nach.gibt es eine Möglichkeit zu "ziehen" ein popup-etwa, wenn es geöffnet wird (wie bei der DragMove () - Methode von windows)?

kann dies getan werden, ohne große Probleme oder muss ich schreiben ein Ersatz für die popup-Klasse selbst?vielen Dank

War es hilfreich?

Lösung

Hier ist eine einfache Lösung mit einem Daumen.

  • Unterklasse Popup in XAML und codebehind
  • Fügen Sie einen Daumen mit width/height auf 0 gesetzt ist (dies kann auch getan werden, XAML)
  • Hören für MouseDown-Ereignisse, die im Popup und heben Sie dasselbe Ereignis auf dem Daumen
  • Bewegen popup auf DragDelta

XAML:

<Popup x:Class="PopupTest.DraggablePopup" ...>
    <Canvas x:Name="ContentCanvas">

    </Canvas>
</Popup>

C#:

public partial class DraggablePopup : Popup 
{
    public DraggablePopup()
    {
        var thumb = new Thumb
        {
            Width = 0,
            Height = 0,
        };
        ContentCanvas.Children.Add(thumb);

        MouseDown += (sender, e) =>
        {
            thumb.RaiseEvent(e);
        };

        thumb.DragDelta += (sender, e) =>
        {
            HorizontalOffset += e.HorizontalChange;
            VerticalOffset += e.VerticalChange;
        };
    }
}

Andere Tipps

Es gibt keinen Dragmove für PopUp. Nur eine kleine Arbeit um, gibt es viele Verbesserungen, die Sie zu diesem hinzufügen.

<Popup x:Name="pop" IsOpen="True" Height="200" Placement="AbsolutePoint"  Width="200">
   <Rectangle Stretch="Fill" Fill="Red"/>            
</Popup>

In der Code-behind, fügen Sie diese mousemove- Ereignis

   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));

        }
    }

Eine andere Möglichkeit, dies zu erreichen, ist Ihre Popup die Platzierung auf Mouse einzustellen. Dies macht die Pop-up zunächst an der Position des Mauszeigers angezeigt.

Dann können Sie entweder einen Daumen oder Mousemove-Ereignis verwenden, um das Popup der Horizontal & Vertical einzustellen. Diese Eigenschaften verschieben, um den Popup weg von seiner ursprünglichen Position, wenn der Benutzer es schleppt.

Denken Sie daran, Horizontal und Vertical zurück auf Null für den nächsten Einsatz des Popup-Reset!

Das Problem mit der Maus zu verlieren, wenn sie zu schnell bewegen, aufgelöst werden kann


Dies ist aus Msdn genommen:

  

Das neue Fenster enthält die Kinder Inhalt Popup.

     

Das Popup-Steuerelement behält einen Verweis auf seine Kinder Inhalt als logisches Kind. Wenn das neue Fenster erstellt wird, wird der Inhalt des Popup ein visuelles Kind des Fensters und bleibt das logische Kind von Popup. Umgekehrt Popup bleibt die logisch Eltern ihres Kind Inhalt.


In den anderen Worten, das Kind des Popup im eigenständigen Fenster angezeigt wird.

Also wenn man versucht, die folgenden:
Popup.CaptureMouse() ist die Erfassung der Wrapper-Fenster und nicht das Popup selbst. Statt mit Popup.Child.CaptureMouse() erfasst das Pop-up.

Und alle anderen Ereignisse sollten mit Popup.Child registriert werden.

Wie Popup.Child.MouseMove, Popup.Child.LostCapture und so weiter

Dies wurde getestet und arbeitet völlig in Ordnung

Private Point startPoint;

 private void Window_PreviewMouseLeftButtonDown(object sender, MouseButtonEventArgs e)
    {

        startPoint = e.GetPosition(null);
    }
private void Window_MouseMove(object sender, MouseEventArgs e)
    {
        if (e.LeftButton == MouseButtonState.Pressed)
        {
            Point relative = e.GetPosition(null);
            Point AbsolutePos = new Point(relative.X + this.Left, relative.Y + this.Top);
            this.Top = AbsolutePos.Y - startPoint.Y;
            this.Left = AbsolutePos.X - startPoint.X;
        }
    }

Das funktioniert mein Fenster zum Ziehen, aber wie es gesagt wurde, wenn ich die Maus schnell bewegen, wäre es aus dem Fenster bekommen und das Ereignis beenden zu erhöhen. Ohne das Ziehen zu erwähnen ist gar nicht so glatt. Hat jemand weiß, wie man es richtig zu tun, schön und glatt Schleppen, ohne es zu verlieren, wenn sie zu schnell gezogen ??? Stellen Sie ein einfaches Beispiel, wenn möglich, andere als eine ganze Tutorial, das Anfänger bekommen würde wie ich in Code verloren. Dank!

Gebäude weg von Jobi Joy 's Antwort, fand ich eine wiederverwendbare Lösung, die Sie als ein hinzufügen können Kontrolle im xAML einer bestehenden Steuer / Seite. Was nicht möglich war, als XAML mit einem Namen hinzugefügt, da es einen anderen Anwendungsbereich hat.

    [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;
        }
    }
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top