MouseClicks достижения заднего окна WPF - PullRequest
0 голосов
/ 11 февраля 2011

Я создал своего рода диалоговое окно «Обработка», которое отображает процессы определенного процесса. Оно содержит один индикатор выполнения и одну метку. Вот код:

public class ProcessingDialog
    {
        FrontWindow win;
        public ProcessingDialog(int min, int max, string initialMessage,string title, bool isContineous)
        {
            Thread th= new Thread(new ThreadStart(delegate()
            {
                win = new FrontWindow();
                win.Title = title;
                if (isContineous == false)
                {
                    win.ProgressBarProgress.Minimum = min;
                    win.ProgressBarProgress.Maximum = max;
                }
                else
                    win.ProgressBarProgress.IsIndeterminate = true;

                win.LabelStatus.Content = initialMessage;
                win.ShowInTaskbar = false;
                win.Topmost = true;
                win.ShowDialog();
            }
            ));
            th.SetApartmentState(ApartmentState.STA);
            th.Start();
        }


        public void Increment(int margin)
        {
            win.Dispatcher.Invoke(new ThreadStart(delegate { win.ProgressBarProgress.Value+=margin; }), null); ;
        }

        public void Reset()
        {
            win.Dispatcher.Invoke(new ThreadStart(delegate { win.ProgressBarProgress.Value=0; }), null); ;
        }

        public void ChangeMessage(string message)
        {
            win.Dispatcher.Invoke(new ThreadStart(delegate { win.LabelStatus.Content=message; }), null); ;
        }


        public void Close()
        {
            win.Dispatcher.Invoke(new ThreadStart(delegate { win.Close(); }), null); ;
        }
    }

Это разметка для FrontWindow:

<Window x:Class="WpfApplicationUnleashed.FrontWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="FrontWindow" Height="165" Width="300" WindowStyle="ThreeDBorderWindow" WindowStartupLocation="CenterOwner" ResizeMode="NoResize">
    <DockPanel>
        <ProgressBar x:FieldModifier="public" x:Name="ProgressBarProgress" Height="15" Margin="20" DockPanel.Dock="Top" VerticalAlignment="Top"></ProgressBar>
        <Label x:FieldModifier="public" x:Name="LabelStatus" Margin="10" VerticalAlignment="Top" HorizontalAlignment="Left" DockPanel.Dock="Bottom"></Label>
    </DockPanel>
</Window>

А вот окно, из которого я показываю диалоговое окно. Оно содержит только одну кнопку, событие щелчка которой выглядит так:

   private void button1_Click(object sender, RoutedEventArgs e)
        {
            ProcessingDialog pd = new ProcessingDialog(0, 10, "Starting", "Processing", false);
            Thread.Sleep(1000);

            pd.ChangeMessage("Step 1");
            pd.Increment(1);
            Thread.Sleep(1000);

            pd.ChangeMessage("Step 2");
            pd.Increment(1);
            Thread.Sleep(1000);

            pd.ChangeMessage("Step 3");
            pd.Increment(1);
            Thread.Sleep(1000);


            pd.ChangeMessage("Step 4");
            pd.Increment(1);
            Thread.Sleep(1000);


            pd.ChangeMessage("Step 5");
            pd.Increment(1);
            Thread.Sleep(1000);


            pd.ChangeMessage("Step 6");
            pd.Increment(1);
            Thread.Sleep(1000);


            pd.ChangeMessage("Step 7");
            pd.Increment(1);
            Thread.Sleep(1000);


            pd.ChangeMessage("Step 8");
            pd.Increment(1);
            Thread.Sleep(1000);


            pd.ChangeMessage("Step 9");
            pd.Increment(1);
            Thread.Sleep(1000);


            pd.ChangeMessage("Step 10");
            pd.Increment(1);
            Thread.Sleep(1000);

            pd.Close();


        }

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

Как я могу предотвратить это?

Ответы [ 2 ]

0 голосов
/ 11 февраля 2011

Если заднее окно не предназначено для использования, когда переднее окно открыто, я бы установил событие в загруженном переднем окне, чтобы отключить заднее окно, а при закрытии включил заднее окно.

0 голосов
/ 11 февраля 2011

Может быть привязать команду к кнопке и написать метод CanExecute, который запрещает выполнение команды, если она уже выполняется.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...