Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Общие вопросы по .NET и C# > Как узнать что сейчас Design Time?


Автор: Bogdan1024 18.5.2009, 21:47
Хочу чтобы кусок кода не выполнялся если человек сейчас ворочает этот контрол в дизайнере. Как узнать что сейчас человек дизайнит, а не работает с приложением? Или может быть можно пометить метод чтобы он выполнялся только во время работы приложения?

Автор: Partizan 19.5.2009, 00:35
Bogdan1024, если у контрола есть Site и его свойство DesignMode == true, то контрол находится в design-time

Автор: Voyager 20.5.2009, 11:42
Код

        public static bool InDesign(IComponent C)
        {

            const int StartFrame = 4;
            Type InterfaceMatch = typeof(IDesignerHost);

            if (C.Site != null)
                return C.Site.DesignMode;

            StackTrace ST = new StackTrace();
            int Cnt = ST.FrameCount - 1;
            for (int I = StartFrame; I < Cnt; I++)
            {
                Type T = ST.GetFrame(I).GetMethod().DeclaringType;
                if (InterfaceMatch.IsAssignableFrom(T))
                    return true;
            }

            return false;
        }

Автор: Bogdan1024 28.9.2009, 21:16
Цитата(Partizan @  18.5.2009,  23:35 Найти цитируемый пост)
Bogdan1024, если у контрола есть Site и его свойство DesignMode == true, то контрол находится в design-time

Походу если открыть контрол2, который содержит контрол1, то контрол1.Site == null :(

Автор: mr.DUDA 29.9.2009, 01:18
Самый правильный способ узнать что сейчас design-time это сделать глобальный статический флаг IsRunTime в любом классе и поставить его в true в методе Main проги, --- проверено и работает...  smile 

Если же речь идёт о компоненте (длл), то конечно придётся возиться с Site, тут уже сложнее. Возможно придётся проверять есть ли у контрола парент сайт и т.п.

Автор: Bogdan1024 29.9.2009, 09:12
Цитата(mr.DUDA @ 29.9.2009,  00:18)
Самый правильный способ узнать что сейчас design-time это сделать глобальный статический флаг IsRunTime в любом классе и поставить его в true в методе Main проги, --- проверено и работает...  smile 

Как это? Не понимаю. МОжно код?

Добавлено через 6 минут и 31 секунду
Оу! Код Voyager'a реально работает! Спасибо, Voyager!

Автор: mr.DUDA 29.9.2009, 13:30
Program.cs
Код
using System;
using System.Windows.Forms;

namespace WindowsFormsApplication1
{
    static class Program
    {
        public static bool IsDesignMode = true;

        [STAThread]
        static void Main()
        {
            IsDesignMode = false;

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


Любой контрол или форма:
Код
using System;
using System.Windows.Forms;

namespace WindowsFormsApplication1
{
    public partial class UserControl1 : UserControl
    {
        public UserControl1()
        {
            InitializeComponent();

            if (!Program.IsDesignMode)
                MessageBox.Show("Можно сделать что-нибудь злое, мы не в редакторе форм");
        }
    }
}

Автор: DsAEkb 29.9.2009, 20:05
99,9% работающий способ

Код

Private Shared Function IsInDesignMode() As Boolean
        Dim returnFlag As Boolean = False
#If DEBUG Then
        If System.ComponentModel.LicenseManager.UsageMode = System.ComponentModel.LicenseUsageMode.Designtime Then
            returnFlag = True
        ElseIf Process.GetCurrentProcess().ProcessName.ToUpper().Equals("DEVENV") Then
            returnFlag = True
        End If
#End If
        Return returnFlag
    End Function

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