Как сделать блокирование ChildWindow

Много игр, выпущенных , Игры ABA записаны в D 1.x, хотя я предполагаю, что консольные порты должны были быть переписаны в C++.

я записал довольно много игровых прототипов в D, но я не уверен, квалифицирует ли это как 'реальный мир', так как я записал им для моего собственного преимущества и никогда не выпускал ни одного из них.

14
задан Mike Hall 13 August 2009 в 17:59
поделиться

3 ответа

Я не верю, что он поддерживает такое поведение. Вы можете проголосовать за него на CodePlex. В зависимости от того, что вы хотите, вы можете либо посмотреть здесь некоторые обходные пути Тима Хойера , либо использовать другой настраиваемый элемент управления, например Silverlight Modal Control (на CodePlex) .

.
7
ответ дан 1 December 2019 в 14:22
поделиться

Вы можете ' Не делайте то, что вы пытаетесь сделать в Silverlight. Любые изменения, которые вы вносите в пользовательский интерфейс, будут выполняться в потоке пользовательского интерфейса. Если вы заблокируете поток пользовательского интерфейса, пользователь не сможет взаимодействовать с браузером, поэтому они не могут предпринять никаких действий, чтобы разблокировать поток.

Если вы действительно хотите создать блокирующее диалоговое окно, единственный способ сделать это - из потока без пользовательского интерфейса. Например, вы можете создать метод, который выглядит примерно так:

    private void ShowModalDialog()
    {
        AutoResetEvent waitHandle = new AutoResetEvent(false);
        Dispatcher.BeginInvoke(() =>
        {
            ChildWindow cw = new ChildWindow();
            cw.Content = "Modal Dialog";
            cw.Closed += (s, e) => waitHandle.Set();
            cw.Show();
        });
        waitHandle.WaitOne();
    }

Этот метод будет отображать диалоговое окно и не вернется, пока диалоговое окно не будет закрыто. Но этот метод можно вызвать только из не-UI-потока . Вызов его из потока пользовательского интерфейса вызовет взаимоблокировку (поскольку поток пользовательского интерфейса ожидает события, которое может сработать только в потоке пользовательского интерфейса).

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

вы можете создать метод, который выглядит примерно так:

    private void ShowModalDialog()
    {
        AutoResetEvent waitHandle = new AutoResetEvent(false);
        Dispatcher.BeginInvoke(() =>
        {
            ChildWindow cw = new ChildWindow();
            cw.Content = "Modal Dialog";
            cw.Closed += (s, e) => waitHandle.Set();
            cw.Show();
        });
        waitHandle.WaitOne();
    }

Этот метод будет отображать диалоговое окно и не вернется, пока диалоговое окно не будет закрыто. Но этот метод можно вызвать только из не-UI-потока . Вызов его из потока пользовательского интерфейса вызовет взаимоблокировку (поскольку поток пользовательского интерфейса ожидает события, которое может сработать только в потоке пользовательского интерфейса).

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

вы можете создать метод, который выглядит примерно так:

    private void ShowModalDialog()
    {
        AutoResetEvent waitHandle = new AutoResetEvent(false);
        Dispatcher.BeginInvoke(() =>
        {
            ChildWindow cw = new ChildWindow();
            cw.Content = "Modal Dialog";
            cw.Closed += (s, e) => waitHandle.Set();
            cw.Show();
        });
        waitHandle.WaitOne();
    }

Этот метод будет отображать диалоговое окно и не вернется, пока диалоговое окно не будет закрыто. Но этот метод можно вызвать только из не-UI-потока . Вызов его из потока пользовательского интерфейса вызовет взаимоблокировку (поскольку поток пользовательского интерфейса ожидает события, которое может сработать только в потоке пользовательского интерфейса).

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

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

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

5
ответ дан 1 December 2019 в 14:22
поделиться

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

например

например

   <Grid x:Name="LayoutRoot" HorizontalAlignment="Stretch" VerticalAlignment="Stretch">
        <Rectangle Fill="LightBlue" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" Opacity="0.3" />
    </Grid>

, а затем в настраиваемом элементе управления

Utilities.UITools.MessageBox x = new Utilities.UITools.MessageBox();
x.SetError(e.Result);
this.LayoutRoot.Children.Add(x);

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

-1
ответ дан 1 December 2019 в 14:22
поделиться
Другие вопросы по тегам:

Похожие вопросы: