Thaana Paana Ответов: 1

Не удается правильно установить положение созданных во время выполнения элементов управления в положение курсора в vs [C#, WPF]


Я закончил создание простой функции управления перетаскиванием и позже обнаружил, что она работает только с разработанными/созданными элементами управления, но не с элементами управления временем выполнения. Когда я нажимаю/удерживаю элемент управления во время выполнения, его позиция не устанавливается правильно в положение моего курсора, он устанавливается в правом нижнем углу немного далеко от моего курсора, но созданные элементы управления работают нормально. Я думаю, что неправильно добавляю элементы управления временем выполнения в свою сетку. Вот мой xml, я добавляю свои элементы управления временем выполнения в displaygrid.

<Window x:Class="MN.MainWindow"
        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"
        xmlns:local="clr-namespace:MN"
        mc:Ignorable="d"
        Title="MainWindow" Height="350" Width="525" WindowStartupLocation="CenterScreen" Topmost="True" ResizeMode="NoResize" Background="{x:Null}" AllowsTransparency="True" WindowStyle="None">
    <Grid x:Name="displaygrid">
        <Rectangle Fill="#FFF4F4F5" Stroke="Black">
            <Rectangle.Effect>
                <BlurEffect Radius="25"/>
            </Rectangle.Effect>
        </Rectangle>
        <ListBox x:Name="tablist" Background="{x:Null}" FontSize="48" SelectionChanged="tablist_SelectionChanged"/>
    </Grid>
</Window>

Я добавил свой контроль времени выполнения следующим образом

TextBlock newctrl = new TextBlock();
displaygrid.Children.Add(newctrl);
newctrl.Width = ctrl.width;
newctrl.Height = ctrl.height;
newctrl.Margin = new Thickness(ctrl.left, ctrl.top, 0, 0);
newctrl.Text = ctrl.text;
active_ctrls.Add(newctrl);
newctrl.PreviewMouseDown += enable_ctrldrag;


И сделал это, чтобы переместить мой контроль на мой курсор

private bool MouseHook_OnMouseMove(int x, int y) // WinputManager Library
        {
            if (_selctrl != null)
            {
                //_selctrl.Margin = new Thickness(x, y, 0, 0);
                _selctrl.Margin = new Thickness(Mouse.GetPosition(this).X, Mouse.GetPosition(this).Y, 0, 0);
            }

            return false;
        }


Что я уже пробовал:

Сделал новый проект, протестировал и выяснил свою проблему + я не использовал никаких библиотек, когда тестировал.

1 Ответов

Рейтинг:
8

Thaana Paana

Нашел свой ответ, когда я возился в WPF, решил его, добавив VerticalAlignment = Top и HorizontalAlignment = Left

TextBlock newctrl = new TextBlock();
displaygrid.Children.Add(newctrl);
newctrl.VerticalAlignment = VerticalAlignment.Top;
newctrl.HorizontalAlignment = HorizontalAlignment.Left;
newctrl.Width = ctrl.width;
newctrl.Height = ctrl.height;
newctrl.Margin = new Thickness(ctrl.left, ctrl.top, 0, 0);
newctrl.Text = ctrl.text;
active_ctrls.Add(newctrl);
newctrl.PreviewMouseDown += enable_ctrldrag;