wpf, c # set Margin.Left из FrameWorkElement с использованием Reflection - PullRequest
0 голосов
/ 22 февраля 2019

Кто-нибудь знает, как установить свойство второго уровня с помощью отражения?В случае, если я хочу установить ширину, скажем, StackPanel, это прекрасно работает:

PropertyInfo pi = stp.GetType().GetProperty("Width", BindingFlags.Public | BindingFlags.Instance);
if (null != pi)
{
  pi.SetValue(stp, Convert.ChangeType("100", pi.PropertyType), null);
}

Но если я хочу установить Margin.Left:

PropertyInfo pi = stp.GetType().GetProperty("Margin.Left", BindingFlags.Public | BindingFlags.Instance);
if (null != pi)
{
  pi.SetValue(stp, Convert.ChangeType("100", pi.PropertyType), null);
}

Это не такработать на всех.пи ноль.Я не могу получить действительную информацию о недвижимости.Попытка получить действительное FieldInfo также не удалась:

FieldInfo prop = stp.GetType().GetField("Margin.Left", BindingFlags.Public | BindingFlags.Instance);
if (null != prop)
{
  prop.SetValue(stp, Convert.ChangeType("20", prop.FieldType));
}

1 Ответ

0 голосов
/ 22 февраля 2019

В классе StackPanel нет свойства с именем "Margin.Left".У него есть свойство Margin, которое возвращает ThicknessThickness является типом значения, поэтому, если вы хотите изменить только левое поле, вам все равно нужно создать новый Thickness объект, которому вы присваиваете свойство Margin StackPanel для:

PropertyInfo marginProperty = stp.GetType().GetProperty("Margin", BindingFlags.Public | BindingFlags.Instance);
if (null != marginProperty)
{
    Thickness thickness = (Thickness)marginProperty.GetValue(stp);
    marginProperty.SetValue(stp, new Thickness(100d, thickness.Top, thickness.Right, thickness.Bottom));
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...