2013-12-02 3 views
0

im работает сейчас на UserControl, который ive сделал перетаскиванием, используя код ниже (который довольно известен и используется). Это UserControl выглядит и используется в сходстве с MessageBox (серый цвет и синий прямоугольник), задача состоит в том, чтобы сделать это UserControl перетаскиваемым только из синего прямоугольника точно так же, как любой MessageBox, а не как его теперь перетаскивать из любого места в нем!Как сделать управление пользователем перетаскиванием только из определенных мест

любые предложения о том, как это сделать? заранее спасибо!

ниже кода, используемого для перетаскивания UserControl

public UserControl1(Data data, Settings settings) 
{ 


     InitializeComponent(); 
     MouseLeftButtonDown += new MouseButtonEventHandler(root_MouseLeftButtonDown); 
     MouseLeftButtonUp += new MouseButtonEventHandler(root_MouseLeftButtonUp); 
     MouseMove += new MouseEventHandler(root_MouseMove); 
} 

... 



private void root_MouseLeftButtonDown(object sender, MouseButtonEventArgs e) 
     { 

      var element = sender as FrameworkElement; 
      anchorPoint = e.GetPosition(null); 

      element.CaptureMouse(); 
      isInDrag = true; 
      e.Handled = true; 

     } 



    private void root_MouseLeftButtonUp(object sender, MouseButtonEventArgs e) 
     { 
      if (isInDrag) 
      { 
       var element = sender as FrameworkElement; 
       element.ReleaseMouseCapture(); 
       isInDrag = false; 
       e.Handled = true; 
      } 
     } 


     private void root_MouseMove(object sender, MouseEventArgs e) 
     { 
      if (isInDrag) 
      { 

       var element = sender as FrameworkElement; 
       currentPoint = e.GetPosition(null); 


       UIElement parentElement = (UIElement)this.Parent; 

       maxHeightParent = parentElement.RenderSize.Height; 
       maxWidthParent = parentElement.RenderSize.Width; 

       maxHeight = RenderSize.Height; 
       maxWidth = RenderSize.Width; 

       //Window.ActualHeightProperty 


       //element.ActualHeight 

       transform.X += (currentPoint.X - anchorPoint.X); 


       transform.Y += (currentPoint.Y - anchorPoint.Y); 

       this.RenderTransform = transform; 
       anchorPoint = currentPoint; 
      } 

     } 




    } 

ответ

0

Два способа решения этой проблемы, которые на самом деле так же, как с другим синтаксисом:

  1. через код - в конструкторе, вместо

    MouseLeftButtonDown += new MouseButtonEventHandler(root_MouseLeftButtonDown); 
    MouseLeftButtonUp += new MouseButtonEventHandler(root_MouseLeftButtonUp); 
    MouseMove += new MouseEventHandler(root_MouseMove); 
    

    использование

    myBlueRect.MouseLeftButtonDown += 
          new MouseButtonEventHandler(root_MouseLeftButtonDown);` 
    myBlueRect.MouseLeftButtonUp += 
          new MouseButtonEventHandler(root_MouseLeftButtonUp); 
    myBlueRect.MouseMove += new MouseEventHandler(root_MouseMove); 
    
  2. Via XAML - в тегах соответствующего элемента, который вы хотите Grag из (позволяет сказать, что это Grid):

    <Grid x:Name="myBlueRect" 
         MouseLeftButtonDown="root_MouseLeftButtonDown" 
         MouseLeftButtonUp="root_MouseLeftButtonUp" 
         MouseMove="root_MouseMove" 
         .../> 
    
0

Два основных варианта я думаю о:

  1. Внутри вашего UserControl сделать прямоугольник бордюром (или другой орган управления), и поставить события на этой границе, а не в UserControl.

  2. Если по какой-то причине вы хотите, чтобы события находились в UserControl, поместите скрытую границу на место прямоугольника, и в этом случае перетащите, только если мышь над этой границей.

Смежные вопросы