Member 10850253 Ответов: 1

Как программно закрыть пользовательский диалог


У меня есть пользовательский диалог, и я хочу закрыть его через несколько секунд.
Я показываю этот диалог, когда пользователь ничего не вводит в 2 текстовых поля, которые у меня есть.
Я не знаю, как выйти из диалога через 1 секунду.
Пожалуйста помочь.

Что я уже пробовал:

Я попытался нажать enter программно, но он только выполняет проверку и заставляет диалоговое окно появиться еще раз после того, как я его закрыл.
Я также попробовал это сделать внутри класса, который я использую для создания пользовательского диалога:
dialog.Close();
dialog.Dispose();

внутри класса есть код для пользовательского диалогового окна, и
DialogResult.OK;

Но это только вешает мое приложение.
Может кто-то пожалуйста, помогите мне?
Спасибо.

1 Ответов

Рейтинг:
5

Dave Kreskowiak

Диалог должен закрыться сам. Поместите таймер в диалоговую форму и установите его на любой тайм-аут. В коде диалогового окна обработайте событие Тика таймера и закройте диалоговое окно оттуда.


Member 10850253

Но Как Это Сделать?
Вот мой код диалогового класса:

public partial class BetterDialog : Form
    {
        /// <summary>
        /// Create a special dialog in the style of Windows XP or Vista. A dialog has a custom icon, an optional large
        /// title in the form, body text, window text, and one or two custom-labeled buttons.
        /// </summary>
        /// <param name="titleString">This string will be displayed in the system window frame.</param>
        /// <param name="bigString">This is the first string to appear in the dialog. It will be most prominent.</param>
        /// <param name="smallString">This string appears either under the big string, or is null, which means it is
        /// not displayed at all.</param>
        /// <param name="leftButton">This is the left button, typically the "accept" button--label it with an
        /// action verb (or "OK").</param>
        /// <param name="rightButton">The right button--typically "Cancel", but could be "No".</param>
        /// <param name="iconSet">An image to be displayed on the left side of the dialog. Should be 32 x 32 pixels.</param>
        static public DialogResult ShowDialog(string title, string largeHeading, string smallExplanation,string leftButton, string rightButton, Image iconSet)
        {
            //title, largeHeading,smallExplanation, leftButton, rightButton, iconSet
            using (BetterDialog dialog = new BetterDialog(title, largeHeading, smallExplanation, leftButton,rightButton, iconSet))
            {
                DialogResult result = dialog.ShowDialog();                
                return result;                               
            }
        }

        /// <summary>
        /// The private constructor. This is only called by the static method ShowDialog.
        /// </summary>
        private BetterDialog(string title, string largeHeading, string smallExplanation,string leftButton, string rightButton, Image iconSet)
        {
            this.Font = SystemFonts.MessageBoxFont;
            this.ForeColor = SystemColors.WindowText;

            InitializeComponent();

            // set our width and height to these values (redundant, but who cares?)
            this.Width = 350;
            this.Height = 150;

            using (Graphics graphics = this.CreateGraphics())
            {
                SizeF smallSize;
                SizeF bigSize;

                if (string.IsNullOrEmpty(smallExplanation) == false)
                {
                    if (SystemFonts.MessageBoxFont.FontFamily.Name == "Segoe UI")
                    {
                        // use the special, windows-vista font style if we are running vista (using Segoe UI).
                        label1.ForeColor = Color.FromArgb(0, 51, 153); // [ColorTranslator.FromHtml("#003399")]
                        label1.Font = new Font("Segoe UI", 12.0f, FontStyle.Regular, GraphicsUnit.Point);

                        // bigger for vista/aero
                        this.Width += 50;

                        label1.Width += 50;
                        label2.Width += 50;

                        smallSize = graphics.MeasureString(smallExplanation, this.Font, this.label2.Width);
                        bigSize = graphics.MeasureString(largeHeading, label1.Font, this.label1.Width);

                        this.Height = (int)smallSize.Height + 158;

                        // add in a little margin on the top as well
                        pictureBox1.Margin = new Padding(pictureBox1.Margin.Left, pictureBox1.Margin.Top + 6,
                            pictureBox1.Margin.Right, pictureBox1.Margin.Bottom);
                    }
                    else
                    {
                        // might want to special case the old, MS Sans Serif font.
                        // use the regular

Dave Kreskowiak

    Close();

Member 10850253

Я использовал это, и ничего не происходит:

using (BetterDialog dialog = new BetterDialog(title, largeHeading, smallExplanation, leftButton,rightButton, iconSet))
            {
                DialogResult result = dialog.ShowDialog();
                Thread.Sleep(1000);
                dialog.Close();
                return result;                               
            }

Dave Kreskowiak

Вернитесь и перечитайте то, что я написал. Код таймера входит в код диалогового окна, а не в код формы, который создает экземпляр диалогового окна.

Member 10850253

Я сделал, как вы предлагали, но ничего не произошло.

<pre>private void timer1_Tick(object sender, EventArgs e)
        {
            Close();
        }

Dave Kreskowiak

Вы установили таймер и запустили его? Возможно, вы захотите прочитать документацию по нему. Таймер[^]