Как сделать ссылку на структуру в C # - PullRequest
9 голосов
/ 27 сентября 2011

в моем приложении у меня есть элемент управления LineShape и пользовательский элемент управления (по сути, PictureBox с меткой).

Я хочу, чтобы LineShape изменил координаты одной из своих точек в соответствии с расположением пользовательского элемента управления.

У меня была идея установить ссылку на точку LineShape внутри пользовательского элемента управления и добавить обработчик события изменения местоположения, который изменяет координаты ссылочной точки.

Однако в Point есть структура, представляющая собой тип значения, поэтому он не будет работать. У кого-нибудь есть идеи, как сделать ссылку на структуру, или, может быть, кто-то знает обходной путь для моей проблемы?

Я попробовал решение относительно использования типа Nullable, но оно все еще не работает. Вот как я определяю поле в моем пользовательском элементе управления (DeviceControl):

private Point? mConnectionPoint;

И реализация обработчика событий изменения местоположения:

private void DeviceControl_LocationChanged(object sender, EventArgs e)
{
    if (mConnectionPoint != null)
    {
        DeviceControl control = (DeviceControl)sender;

        Point centerPoint= new Point();
        centerPoint.X = control.Location.X + control.Width / 2;
        centerPoint.Y = control.Location.Y + control.Height / 2;

        mConnectionPoint = centerPoint;
    }
}

Ответы [ 2 ]

6 голосов
/ 27 сентября 2011

Вы можете передавать типы значений по ссылке, добавляя перед ним 'ref' при передаче метода.

, например:

void method(ref MyStruct param)
{
}
0 голосов
/ 19 июня 2015

Ваш метод на самом деле не требует «ссылочного» доступа к члену mConnectionPoint;Вы можете назначить значения местоположения непосредственно для указанной точки как члена вашего класса:

private void DeviceControl_LocationChanged(object sender, EventArgs e)
{
    if (mConnectionPoint != null)
    {
        DeviceControl control = (DeviceControl)sender;

        mConnectionPoint.X = control.Location.X + control.Width / 2;
        mConnectionPoint.Y = control.Location.Y + control.Height / 2;
    }
}

Однако, если причиной этого кода является перемещение элемента управления LineShape, то вам следует перейти прямо кисточник.Лучший способ изменить свойства элемента управления - просто изменить свойства элемента управления:

    DeviceControl control = (DeviceControl)sender;

    line1.StartPoint = [calculate point1 coordinates];
    line1.EndPoint = [calculate point2 coordinates];
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...