Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Разработка Windows Forms > UserControl в период DesignTime


Автор: Codegrammer 17.6.2010, 17:30
Проблема такая. Control состоит из одного ListBox, который выводит запущенные процессы. Как только я кладу его на форму, он уже во время редактирования начинает показывать инфу. Причем она обновляется!!! Это сильно портит жизнь, т.к. некоторые процессы во время редактирования не дают доступ и начинается фейл. Тупо вылетает студия. Не думаю, что код интересен вам (если надо - я выложу). Можно ли как-то отключить работу UserControl во время редактирования?

Автор: Partizan 17.6.2010, 18:03
Код

if (!DesignMode)
{
.....
}

Автор: explorer 5.7.2010, 17:09
Причем, если проект чисто под Windows (а это, судя по-всему так), то можно реализовать свойство DesignMode для компонента несколькими способами. Сразу оговорюсь, что танцы с бубном, приведенные ниже, имеют смысл только тогда, когда нужно знать режим работы находясь в конструкторе компонента. В иных случаях стандартного ISite.DesignMode вполне достаточно.

1.
Код

public new bool DesignMode 
{
  get
  {
       return { System.Diagnostics.Process.GetCurrentProcess().ProcessName == "devenv" };
  }
}

или еще один вариант, но этот уже на все случаи жизни:
Код

public new bool DesignMode 
{
   if (Site != null)
       return Site.DesignMode;

   StackTrace stackTrace = new StackTrace();
   int frameCount = stackTrace.FrameCount - 1;
   for (int i = 0; i < frameCount; ++i)
   {
        Type type = stackTrace.GetFrame(i).GetMethod().DeclaringType;
        if (typeof(IDesignerHost).IsAssignableFrom(type))
            return true;
   }
   return false;
}

Автор: KelTron 6.7.2010, 19:04
Помню где то на форме было такое решение:
Код

static class Program
{
    public static bool IsRunTime { get; private set; }

    static Program()
    {
        Program.IsRunTime = false;
    }

    /// <summary>
    /// The main entry point for the application.
    /// </summary>
    [STAThread]
    static void Main()
    {
        Program.IsRunTime = true;

        Application.EnableVisualStyles();
        Application.SetCompatibleTextRenderingDefault(false);
        Application.Run(new MainForm()); 
    }
}

Далее в контроле:
Код

if (!Program.IsRunTime)
{
   ...
}

Автор: Лен 7.7.2010, 10:44
В своё время поимел очень много проблем с определением DesignMode. Поделюсь наблюдениями:
1. Не работает, если проверка осуществляется в контроле, который позже в дизайнере студии ложится на какую-либо форму или другой контрол.
Код

if (!DesignMode)



2. Небезопасно, ибо может швырять исключения.
Код

return { System.Diagnostics.Process.GetCurrentProcess().ProcessName == "devenv" };



3. Посему уже почти два года используем следующий вариант: ищем первый контейнер, для которого включен DesignMode
Код

public new bool DesignMode
{
  get
    {
      Control c = this;
      while (c != null)
      {
        Form form = c.FindForm();
        if ((form != null) && (form.Site != null) && form.Site.DesignMode)
          return true;

        if ((c.Site != null) && c.Site.DesignMode)
          return true;

        c = c.Parent;
      }

      return false;
    }
}

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)