Простое исправление, как сказал @Sean, измените struct
на class
.
Если оно должно быть struct
, вам нужно отнести this
к локальной переменной:
MyStruct self = this;
MyButton.Click += (a, e) =>
{
// Assuming Rectangle here is System.Windows.Shapes.Rectangle
self.MyRectangle.Fill = Brushes.Red;
}
Я также могу дать вам некоторые объяснения об ошибке:
Ошибка заключается в том, что this
, что эффективно ref this
в struct
, является указатель, который не может быть захвачен и сохранен в Delegate.Target
.
Чтобы получить this
, захваченный делегатом, вам нужно разыменовать this
в локальной переменной и перехватить значение в переменной.
Однако, когда вы делаете выше, компилятор создает защитную копию, то есть self
является копией структуры, на которую указывает this
. Это означает, что, хотя вы все еще можете вносить изменения в поля / свойства, чьи возвращаемые типы являются ссылочными типами, любые изменения, внесенные в сам экземпляр self
, а также в те типы значений, которые возвращают поля / свойства, не будут отражены в this
.