2015-01-11 3 views
0

Я пытаюсь получить код для работы, который позволяет перемещать UIElement с помощью мыши. Он работает, за исключением случаев, когда элемент пользовательского интерфейса перемещается в пределах его высоты или ширины снизу или справа от его содержащего окна, которое обрезается. После изменения размера UIElement вытащили его очевидное, что область отсечения пропорциональна ширине или высоте относительно правого или нижнего.WPF обрезка границы при перемещении с помощью мыши

<Window 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
    x:Class="MainWindow" 
    mc:Ignorable="d" 
    Title="" Height="500" Width="500" MaxWidth="500" MaxHeight="500"> 
    <Grid> 
     <Border BorderBrush="Black" 
      MouseLeftButtonDown="UIElement_OnMouseLeftButtonDown" 
      MouseLeftButtonUp="UIElement_OnMouseLeftButtonUp" 
      MouseMove="UIElement_OnMouseMove" BorderThickness="1" Background="#FFDE1B1B"    
      VerticalAlignment="Top" HorizontalAlignment="Left" Width="100" Height="100"  
      Margin="84,82,0,0"/> 
    </Grid> 
</Window> 

public partial class MainWindow : Window 
{ 
    private bool moving = false; 
    Point _previous = new Point(); 

    public MainWindow() 
    { 
     InitializeComponent(); 
    } 

    private void UIElement_OnMouseLeftButtonDown(object sender, MouseButtonEventArgs e) 
    { 
     var l = e.Source as UIElement; 
     if (l != null && l.IsMouseDirectlyOver) 
     { 
      _previous = e.GetPosition(null); 
      l.CaptureMouse(); 
      moving = true; 
     } 
    } 

    private void UIElement_OnMouseLeftButtonUp(object sender, MouseButtonEventArgs e) 
    { 
     Console.WriteLine(this.Width + ", " + this.Height); 

     var l = e.Source as UIElement; 
     if (l != null) 
     { 
      l.ReleaseMouseCapture(); 
      moving = false; 
     } 
    } 

    private void UIElement_OnMouseMove(object sender, MouseEventArgs e) 
    { 
     if (moving) 
     { 
      var p = e.GetPosition(null); 

      if (_previous != default(Point)) 
      { 
       var ui = sender as FrameworkElement; 

       var deltaX = p.X - _previous.X; 
       var deltaY = p.Y - _previous.Y; 

       ui.Margin = new Thickness(
        Math.Max(ui.Margin.Left + deltaX, 0), 
        Math.Max(ui.Margin.Top + deltaY, 0), 
        ui.Width, 
        ui.Height); 

       Title = ui.Margin.ToString(); 
      } 
      _previous = p; 
     } 
    } 
} 

В настоящее время не знаю, почему граница обрезана.

ответ

0

Потому что вы специально задали маржу справа на ui.Width, а край к нижнему краю - ui.Height. Установите их как 0 (значение по умолчанию), и элемент не обрезается.

ui.Margin = new Thickness(
       Math.Max(ui.Margin.Left + deltaX, 0), 
       Math.Max(ui.Margin.Top + deltaY, 0), 
       0, //ui.Width, 
       0); //ui.Height); 
+0

благодарит за работу. – jaz

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