Сравнение отрисовки UserControl и Window при перемещении

110
22 апреля 2021, 17:00

У меня появилась потребность перетаскивания UserContol по родительскому Grid'y. Заметил что при перетаскивании контрола появляется задержка визуализации, не смотря на то что Margin у UserControl уже присвоен окончательный, сам контрол еще не закончил движение.

Я решил проверить тот же принцип работы но уже на Window. Там пример работает идеально и отклонение даже если и есть то +-1px.

Синий круг это UserControl который находится на сером Grid

Красный круг это отдельное окно которое перемещается с помощью this.DragMove()

Помогите разобраться с этой проблемой, пожалуйста! Архив с самим проектом

Answer 1

Я упростил код XAML контрола UserControl1, изменил механизм пересчёта его положения при перемещении - и у меня на ПК при перемещении контрола и окна почти не заметно разницы. UserContol.xaml.cs:

/// <summary>
/// Логика взаимодействия для UserControl1.xaml
/// </summary>
public partial class UserControl1 : Grid
{
    Point _startPoint;
    Vector _startTransform;
    public UserControl1()
    {
        InitializeComponent();
    }
    private void Grid_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
    {
        // Сохраняем начальные значения до того как захватываем мышь
        _startPoint = e.GetPosition(Parent as Window);
        _startTransform = new Vector(controlTranslateTransform.X, controlTranslateTransform.Y);
        CaptureMouse();
    }
    private void Grid_MouseLeftButtonUp(object sender, MouseButtonEventArgs e)
    {            
        ReleaseMouseCapture();
    }
    private void Grid_MouseMove(object sender, MouseEventArgs e)
    {
        if (IsMouseCaptured)
        {
            Vector offset = Point.Subtract
                (e.GetPosition(Parent as Window), _startPoint);
            controlTranslateTransform.X = (_startTransform + offset).X;
            controlTranslateTransform.Y = (_startTransform + offset).Y;
        }
    }
}

UserControl.xaml:

<Grid
    x:Class="WpfApp3.UserControl1"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    MouseLeftButtonDown="Grid_MouseLeftButtonDown"
    MouseLeftButtonUp="Grid_MouseLeftButtonUp"
    MouseMove="Grid_MouseMove">
    <Grid.RenderTransform>
        <TranslateTransform x:Name="controlTranslateTransform"/>
    </Grid.RenderTransform>
    <Ellipse Fill="Blue"/>
    <Label
        Content="U"
        FontSize="40"        
        FontWeight="Bold"
        HorizontalAlignment="Center"
        VerticalAlignment="Center"
        Foreground="LightPink"/>
</Grid>

Переделанный проект выложил тут (VS 2019): https://cloud.mail.ru/public/6mBA/dV2GMwY3o

READ ALSO
Не удается найти часть пути к файлу

Не удается найти часть пути к файлу

Есть проект библиотеки в котором необхдимо хранить XML файлСтруктура такова:

103
Соединение с Oracle RAC через ODP.NET

Соединение с Oracle RAC через ODP.NET

Доброго времени суток!

95
Как получить доступ к UISpite?

Как получить доступ к UISpite?

Есть код, который создаёт объекты с компонентом Image, в котором я хочу заменить Source Image на один из дефолтных, через код

94