Вот как я этого добиваюсь
edit_login_emailOrPhone.setOnFocusChangeListener(new View.OnFocusChangeListener() {
@Override
public void onFocusChange(View v, boolean hasFocus) {
if(hasFocus)
{
textInputLayout_login_emailOrPhone.setTypeface(APSApplication.getInstance().getFonts().getTypefaceSemiBold());
}else
{
textInputLayout_login_emailOrPhone.setTypeface(APSApplication.getInstance().getFonts().getTypefaceRegular());
}
}
});
Проблема в том, что Margin
является свойством, а его тип ( Thickness
) является типом значения. Это означает, что при доступе к свойству вы получаете копию значения обратно.
Даже если вы можете изменить значение Thickness.Left
] для определенного значения (grr ... изменяемые типы значений не должны существовать), это не изменит поля.
Вместо этого вам нужно установить для свойства Margin
новое значение. Например (по совпадению, тот же код, что написал Марк):
Thickness margin = MyControl.Margin;
margin.Left = 10;
MyControl.Margin = margin;
В качестве примечания к дизайну библиотеки я бы очень предпочел, чтобы Толщина
была неизменной, но с методами, которые возвращали новое значение, которое было копия оригинала, но с замененной частью. Тогда вы могли бы написать:
MyControl.Margin = MyControl.Margin.WithLeft(10);
Не беспокойтесь о странном поведении изменяемых типов значений, красиво и читабельно, все одно выражение ...
Я бы очень предпочел, чтобы Толщина
была неизменной, но с методами, возвращающими новое значение, которое было копией оригинала, но с одной замененной частью. Тогда вы могли бы написать:
MyControl.Margin = MyControl.Margin.WithLeft(10);
Не беспокойтесь о странном поведении изменяемых типов значений, красиво и читабельно, все одно выражение ...
Я бы очень предпочел, чтобы Толщина
была неизменной, но с методами, возвращающими новое значение, которое было копией оригинала, но с одной замененной частью. Тогда вы могли бы написать:
MyControl.Margin = MyControl.Margin.WithLeft(10);
Не беспокойтесь о странном поведении изменяемых типов значений, красиво и читабельно, все одно выражение ...
Свойство Margin
возвращает структуру Толщина
, из которых Left
является свойством. Оператор копирует значение структуры из свойства Margin
и устанавливает значение свойства Left
на копии. Вы получаете сообщение об ошибке, потому что установленное вами значение не будет сохранено обратно в свойство Margin
.
(Более ранние версии C # просто позволяли вам делать это без жалоб, вызывая много вопросов в группах новостей и форумы о том, почему подобное утверждение вообще не имело эффекта ...)
Чтобы установить свойство, вам нужно получить структуру Толщина
из свойства Margin
, установите значение и сохранить его обратно:
Thickness m = MyControl.Margin;
m.Left = 10;
MyControl.Margin = m;
Если вы собираетесь установить все поля, просто создайте структуру Толщина
и установите их все сразу:
MyControl.Margin = new Thickness(10, 10, 10, 10);
Можно предположить, что (а мой WPF сейчас немного заржавел), что Margin принимает объект и не может быть изменен напрямую.
например
MyControl.Margin = new Margin(10,0,0,0);
Margin
возвращает структуру, что означает, что вы редактируете копию . Вам понадобится что-то вроде:
var margin = MyControl.Margin;
margin.Left = 10;
MyControl.Margin = margin;