Как отобразить индикатор выполнения сверх управления в WPF

Ваша программа работает с правами обычного пользователя или с полными правами администратора? Если вы не можете получить текст окна из программ, работающих с полными правами администратора, это может быть связано с тем, что Microsoft ввела « фильтр сообщений привилегий пользовательского интерфейса (UIPI) » в Windows Vista: по умолчанию процесс не может отправить оконное сообщение другому процессу с более высоким уровнем целостности.

Если это так, и у вас есть исходный код программ, которые не дают действительных результатов, вы можете использовать API ChangeWindowMessageFilterEx (Windows 7 / Server 2008 R2 и выше), чтобы разрешить выбор или [ 112] ChangeWindowMessageFilter (Windows Vista / Server 2008), чтобы позволить всем сообщениям из непривилегированной программы достигать процесса, который выполняется с более высокими привилегиями.

10
задан Joel Coehoorn 1 December 2008 в 01:22
поделиться

2 ответа

Не идите с adorner - что я делаю, имеют два отдельных контейнерных средств управления (обычно сетки), которые занимают ту же область экрана. Каждый - мое управление "прогрессом", и другой мой "довольный" управление. Я установил видимость управления прогрессом к Свернутому и видимость довольного управление к Видимому по умолчанию.

Если у Вас есть он, настроил тот путь, когда Вы запускаете асинхронный вызов к веб-сервису, можно сделать успехи управлять видимый и довольное свернутое управление. Когда веб-сервис заканчивается, имейте его, используют Диспетчера. BeginInvoke для обновления UI, и в той точке, переключают управление прогрессом назад на свернутый и довольное управление назад к видимому.

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

    <Grid x:Name="layoutRoot">
        <Grid x:Name="contentGrid" HorizontalAlignment="Center" VerticalAlignment="Center" Visibility="Visible">
             <!-- snip -->
        </Grid>

        <controls:ProgressGrid x:Name="progressGrid" Text="Signing in, please wait..." Visibility="Collapsed"/>
    </Grid>

И в коде позади, просто что-то простое как это:

    private void SignInCommand_Executed(object sender, ExecutedRoutedEventArgs e)
    {
        contentGrid.Visibility = Visibility.Collapsed;
        progressGrid.Visibility = Visibility.Visible;
    }
10
ответ дан 4 December 2019 в 01:03
поделиться

Существует прием, который можно использовать с нулевым Холстом высоты, который мог бы работать. Книга WPF Chris Anderson вдается в подробности об этом и почему это работает, но это проходит примерно так.

  • создайте StackPanel
  • добавьте Холст с Высотой = "0" и высокий z-индекс к панели стека
  • добавьте свой пользовательский элемент управления к панели стека.

Когда Вы хотите показать, что индикатор выполнения добавляет его к нулевому холсту высоты. Это позволит Вам располагать его над пользовательским элементом управления. Холст позволяет Вам идти вне его границ. Центрирование индикатора выполнения должно просто потребовать рассмотрения размеров пользовательского элемента управления и установки положения индикатора выполнения на Холсте соответственно. Удалите индикатор выполнения из холста, когда Вы будете сделаны.

Вот простой пример, который использует TextBox. Это не прекрасно, но это показывает идею. Нажатие на кнопку показывает TextBox сверху InkCanvas

<DockPanel LastChildFill="True">
    <Button DockPanel.Dock="Top" Name="showButton" Click="showProgress">show</Button>
    <StackPanel DockPanel.Dock="Bottom">
        <Canvas Name="zeroHeight" Height="0"/>
        <InkCanvas Name="inky">
        </InkCanvas>
    </StackPanel>
</DockPanel>


private void showProgress(object sender, RoutedEventArgs e)
{
    TextBox box = new TextBox();
    box.Text = "on top";
    StackPanel.SetZIndex(zeroHeight, 8);
    zeroHeight.Children.Add(box);
    box.Width = 30;
    box.Height = 30;
    Canvas.SetLeft(box, 10);
    Canvas.SetTop(box, 10);
    Canvas.SetZIndex(box, 10);
}
1
ответ дан 4 December 2019 в 01:03
поделиться
Другие вопросы по тегам:

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