2009-10-30 20 views
7

ポップアップのデフォルトの動作は、画面の端を超えてポップアップが配置される場合、ポップアップはその位置を変更します。この動作をオフにする方法はありますか?WPFポップアップが画面にバインドされないようにする

ユーザーが画面上でドラッグできるポップアップがあります。しかし、それが端に達すると、それは固まってしまいます。それは、マウスが端から遠くまでドラッグされるまで、端につかれてそこにとどまります。また、私は2つのモニターを持っていて、ポップアップをエッジにドラッグすると、2つのモニターが共有します。私はちらつきがあります。ポップアップは2つのモニター間でちらつきます。

答えて

3

ただ、ここで

(ドラッグする)あなたのポップアップを移動するために相互運用機能を使用ドラッグ処理を追跡する親指用のコード

領域親指

private Thumb mThumb = null; 
    public Thumb Thumb 
    { 
     get { return mThumb; } 
     set 
     { 
      if (mThumb != value) 
      { 
       if (mThumb != null) 
       { 
        DetachThumb(); 
       } 
       mThumb = value; 
       if (mThumb != null) 
       { 
        AttachThumb(); 
       } 
      } 
     } 
    } 

    private void AttachThumb() 
    { 
     Thumb.DragStarted += Thumb_DragStarted; 
     Thumb.DragDelta += Thumb_DragDelta; 
     Thumb.DragCompleted += Thumb_DragCompleted; 
    } 

    private void DetachThumb() 
    { 
     Thumb.DragStarted -= Thumb_DragStarted; 
     Thumb.DragDelta -= Thumb_DragDelta; 
     Thumb.DragCompleted -= Thumb_DragCompleted; 
    } 

    private void Thumb_DragStarted(object sender, DragStartedEventArgs e) 
    { 
     mIsThumbDragging = true; 
     mPreviousDiffX = 0; 
     mPreviousDiffY = 0; 
    } 

    private void Thumb_DragDelta(object sender, DragDeltaEventArgs e) 
    { 
     if (mIsMoving) 
     { 
      return; 
     } 
     mIsMoving = true; 
     try 
     { 
      if (mIsThumbDragging) 
      { 
       var doubleDetaX = e.HorizontalChange + mPreviousDiffX; 
       var doubleDetaY = e.VerticalChange + mPreviousDiffY; 

       var deltaX = (int)doubleDetaX; 
       var deltaY = (int)doubleDetaY; 

       mPreviousDiffX = (double)deltaX - doubleDetaX; 
       mPreviousDiffY = (double)deltaY - doubleDetaY; 

       HostPopup.Move(deltaX, deltaY); 
      } 
     } 
     finally 
     { 
      mIsMoving = false; 
     } 
    } 

    private void Thumb_DragCompleted(object sender, DragCompletedEventArgs e) 
    { 
     mIsThumbDragging = false; 
    } 

    #endregion 

HostPopupクラスはポップアップのサブクラスでありますinteropを使用してウィンドウを移動するには、以下の方法が必要です。

[DllImport("user32.dll", SetLastError = true)] 
    internal static extern bool MoveWindow(IntPtr hWnd, int X, int Y, int nWidth, int nHeight, bool bRepaint); 

    [DllImport("user32.dll")] 
    [return: MarshalAs(UnmanagedType.Bool)] 
    private static extern bool GetWindowRect(IntPtr hWnd, out RECT lpRect); 

    internal void Move(int deltaX, int deltaY) 
    { 
     if (mIsMoving) 
     { 
      return; 
     } 
     mIsMoving = true; 
     try 
     { 
      if (Child == null) 
       return; 

      var hwndSource = (PresentationSource.FromVisual(Child)) as HwndSource; 

      if (hwndSource == null) 
       return; 
      var hwnd = hwndSource.Handle; 

      RECT rect; 

      if (!GetWindowRect(hwnd, out rect)) 
       return; 

      MoveWindow(hwnd, rect.Left + deltaX, rect.Top + deltaY, (int)Width, (int)Height, true); 
     } 
     finally 
     { 
      mIsMoving = false; 
     } 
    } 
+1

これを実装する方法の詳細は誰でも説明できますか? HostPopupサブクラスへのアクセス方法を教えてください。 GetWindowRect()メソッドはどこにありますか? – Saggio

2

ポップアップをウィンドウのように動作させたい場合は、ポップアップの代わりにウィンドウを作成するだけです。

標準的なポップアップのような位置にはないポップアップを持ち、画面上でドラッグすることができます。使いやすさと混乱の少ないレシピのようです。

+3

不幸にも、 reは、ウィンドウが持っていないポップアップの機能であり、動きの自由よりも私にとって重要です。私は動きを制限しなければならないと思うので、スクリーン境界を越える可能性がなく、したがって、再配置およびちらつきがない。情報をありがとう。 –

+1

合意。私は、ポップアップをウィンドウに従い、WPFアプリケーション(本質的にビジーインジケータ)でホストされているWinFormコントロールへの入力を防ぎ、ウィンドウが画面外にドラッグされた場合、ポップアップは画面の境界を越えたウィンドウをたどりません。 –

+0

これに関する別のデータポイント。ウインドウを開いたときにウインドウを開くと、ウインドウがウインドウを開き、ウインドウを開くとウインドウの分割動作がトリガーされ、ドラッグが中断されることがあります。 (コンテキスト:私はポップアップをドラッグフィードバックウィンドウとして一時的に使用していますが、UIのパーマーナント部分ではありません) – jschroedl

関連する問題