2014-11-01 3 views
0

Есть ли способ изменить свойства формы из отдельного класса в проекте C#? В частности, то, что я пытаюсь сделать с этим, - это возможность добавлять функции замирания в несколько Форм без необходимости переопределять метод и цикл для каждого класса. Вместо этого я хотел бы разместить этот метод, который называется , в отдельном классе с именем SharedMemory и сделать его доступным для всех Форм для простоты.Возможно ли изменить свойства формы из другого класса

Для того, чтобы мне не приходилось создавать класс в каждой форме, чтобы иметь доступ к содержимому SharedMemory, я объявил его содержимое модификатором static.

Вот мой метод петли выцветает, расположенный в SharedMemory классе:

public static void FadeInWindow(Form form, double opacity) 
{ 
    for (double i = 0; i < opacity; opacity += 0.05) 
    { 
      form.Opacity = i; 
      form.Refresh(); 
      System.Threading.Thread.Sleep(10); 
    } 
} 

Я подключил формы в метод с использованием this ключевого слова. Аргумент opacity определяет максимальный предел теоретического уровня непрозрачности формы. Петля for работала нормально, когда помещалась в форму, а не в SharedMemory.

Есть ли способ преодолеть это затруднительное положение?

+1

'i' всегда 0, а' opacity' растет бесконечно - не уверен, что это то, что вы хотели. – SimpleVar

+0

Как вы называете этот метод? –

+0

проверить значение i – jayvee

ответ

3

Две точки:

Во-первых, вы не приращением ценности вы определили в вашем цикл. Вы определяете непрозрачность формы, переданной вашему методу как i, но ваша инкрементная часть - непрозрачность + = 0,05. Ваш цикл for никогда не кончится, и непрозрачность формы, переданной FadeInWindow, никогда не изменится. Я думаю, что если вы исправите эту проблему, вы обнаружите, что ваша форма обновлена ​​по вашему желанию.

Во-вторых, вы не должны использовать удвоение в качестве счетчика в своем цикле for. Это не приведет к возникновению проблемы в этом конкретном случае, но хорошо иметь привычку использовать их вообще. Пример того, где это может подведет вас является следующее:

for (double i = 0; i <= 1.0; i += 0.1) { } 

В зависимости от того, как любая конкретной реализации округляет с плавающей точкой, это может либо выполнить 9 раз или 10 раз. (Подсказка - согласно моей ссылке ниже, это только выполняется 9 раз в VS2013, так что это имеет прямое отношение.) Арифметика с плавающей точкой нигде не предсказуема, как целочисленное добавление (которое полностью предсказуемо в пределах минимальной и максимальной границ тип). Скорее всего, если вы хотите получить кратен 0,05, вы должны сделать следующее:

for (int i = 0; i < 10; i++) 
{ 
    double currentOpacity = (double)i * 0.05; 
} 

Это всегда будет выполняться ровно 10 раз.

Умнее мужчин, чем я объясняю вопрос here.

Смежные вопросы