2016-06-30 17 views
5

numaralı telefonun üst sınırının içinde saklayın. Bir kılavuzun içine sürüklediğim bir kullanıcı kontrolüne sahibim. Z-İndeksi oldukça yüksektir, böylece onu diğer çocukların üzerinde tutabilirim. Kontrolün sürüklenmesi mükemmel çalışır, ancak bir kullanıcı kontrolü ızgara dışında taşımak isterse, buna izin verecektir.Kullanıcı Denetimi'ni sürükleyin, ancak WPF

enter image description here burada ben şimdi ne var, ana kılavuz denetiminde sınırlarını terk onu nasıl duruyorsun:

private System.Windows.Point _anchorPoint; 
    private System.Windows.Point _currentPoint; 
    private bool _isInDrag; 

    private void UserControl_MouseLeftButtonDown(object sender, MouseButtonEventArgs e) 
    { 
     var element = sender as FrameworkElement; 
     _anchorPoint = e.GetPosition(null); 
     if (element != null) element.CaptureMouse(); 
     _isInDrag = true; 
     e.Handled = true; 
    } 

    private void UserControl_MouseLeftButtonUp(object sender, MouseButtonEventArgs e) 
    { 
     if (!_isInDrag) return; 
     var element = sender as FrameworkElement; 
     if (element != null) element.ReleaseMouseCapture(); 
     _isInDrag = false; 
     e.Handled = true; 
    } 

    private void UserControl_MouseMove(object sender, MouseEventArgs e) 
     { 
      if (!_isInDrag) return; 
      _currentPoint = e.GetPosition(null); 

      UIElement container = VisualTreeHelper.GetParent(_parentGrid) as UIElement; 
      System.Windows.Point relativeLocation = _parentGrid.TranslatePoint(new System.Windows.Point(0, 0), container); 

      if (_currentPoint.X > relativeLocation.X) return; 
      if(_currentPoint.Y >= relativeLocation.Y)return; 

      _transform.X += _currentPoint.X - _anchorPoint.X; 
      _transform.Y += (_currentPoint.Y - _anchorPoint.Y); 
      RenderTransform = _transform; 
      _anchorPoint = _currentPoint; 
     } 

"relativeLocation" çalışmıyor şu yüzden, her zaman 0x0 olduğunu. Herhangi bir fikir büyük ölçüde takdir edilecektir.

* Not: UserControl'ümü bir pencereye değiştirdiğimde, sahip olduğum tüm sorunları azaltacağını biliyorum. Ama dürüst olmak gerekirse, bu şekilde harika görünüyor ve gerçekten pencereyi karıştırmak istemiyorum. Bu sistem, kullanıcının tüm penceresini (ayrı bir pencerede açılır) kullanan bir gösterge panosu olarak açılır. Yani burada bir pencere açtığınızda, doğru akmaz.

+0

"parentGrid" öğesinin göreceli konumunu kapsayıcıya hesaplıyor gibi görünüyor. Sıfır noktasını açıklar. Bunun yerine 'UserControl' seçeneğini deneyin, bunun yerine [bu gönderiyi] seçin (http://stackoverflow.com/a/1923775). – bab7lon

cevap

1

Göreceli Konumlara ihtiyacınız olduğunu düşünmüyorum. Matematik, doğru olmak için biraz can sıkıcı olabilir. Bunu test edildiğinde bu iyi çalıştı, bu yaklaşımı deneyin:

private void UserControl_MouseMove(object sender, MouseEventArgs e) 
    { 
     if (!_isInDrag) return; 
     _currentPoint = e.GetPosition(null); 

     //This is the change to the position that we want to apply 
     Point delta = new Point(); 
     delta.X = _currentPoint.X - _anchorPoint.X; 
     delta.Y = _currentPoint.Y - _anchorPoint.Y; 

     //Calculate user control edges 
     var leftEdge = Margin.Left + _transform.X + delta.X; 
     var topEdge = Margin.Top + _transform.Y + delta.Y; 
     var rightEdge = Width + Margin.Left + _transform.X + delta.X; 
     var bottomEdge = Height + Margin.Top + _transform.Y + delta.Y; 

     //Set the delta to 0 if it goes over _parentGrid edges 
     if (leftEdge < 0) delta.X = 0; 
     if (topEdge < 0) delta.Y = 0; 

     if (rightEdge > _parentGrid.Width) delta.X = 0; 
     if (bottomEdge > _parentGrid.Height) delta.Y = 0; 

     //Apply the delta to the user control 
     _transform.X += delta.X; 
     _transform.Y += delta.Y; 
     RenderTransform = _transform; 
     _anchorPoint = _currentPoint; 
    } 
1

Bu işin başıdır

Point position = _parentGrid.PointToScreen(new Point(0, 0)); 
PresentationSource source = PresentationSource.FromVisual(_parentGrid); 
position = source.CompositionTarget.TransformFromDevice.Transform(position); 

Şimdi ana ızgara ekran koordinatları var. Transform() numaralı telefona yapılan çağrı, pikselleri WPF aygıtının bağımsız piksellerine dönüştürerek sistem DPI ayarını eşleştirmesi açısından önemlidir.

İlgili konular