Как центрировать BusyIndicator в центре MainWindow? - PullRequest
0 голосов
/ 05 марта 2019

Я создал пример приложения Wpf и установил Extended WPF Toolkit (пакет NuGet).Вот мой xaml-код для отображения BusyIndicator.

<Window x:Class="WpfApp3.Progress"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:xctk="http://schemas.xceed.com/wpf/xaml/toolkit"
        xmlns:local="clr-namespace:WpfApp3"
        mc:Ignorable="d"
        WindowStyle="None"
        BorderThickness="0"
        Title=""
        VerticalAlignment="Center"
        HorizontalAlignment="Center"
        SizeToContent="WidthAndHeight"
        d:DesignWidth="300" 
        d:DesignHeight="300">
    <xctk:BusyIndicator IsBusy="True"
                        HorizontalAlignment="Center"
                        VerticalAlignment="Center"></xctk:BusyIndicator>
</Window> 

Отображение окна прогресса с этим кодом:

private void Button_Click(object sender, RoutedEventArgs e)
{
  Progress w = new Progress
  {
    Owner = Application.Current.MainWindow,
    WindowStartupLocation = WindowStartupLocation.CenterOwner
  };
  w.Show();
}

Мой вопрос прост.Как показать BusyIndicator в середине экрана MainWindow.Как показано на рисунке ниже, он не центрирован, как должно быть.Обратите внимание, что я использую SizeToContent="WidthAndHeight"

enter image description here

Ответы [ 2 ]

0 голосов
/ 05 марта 2019

Наличие отдельного окна для отображения индикатора занятости и приведет к нежелательному поведению.Что произойдет, если исходное окно развернуто, перемещено и т. Д.?

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

<Window>
<Grid>
<Application stuff ....>
</Application stuff>
  <ContentControl regions:RegionManager.RegionName="OverlayRegion"
                        HorizontalAlignment="Stretch"
                        VerticalAlignment="Stretch" />
    </Grid>
</Window>

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

0 голосов
/ 05 марта 2019

Решил это, удалив свойство Window.SizeToContent и добавив свойства VerticalAlignment и HorizontalAlignment в BusyIndicator (на самом деле сейчас я использовал spinner, но это не имеет значения в решении).

<Window x:Class="Test.Progress"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
        xmlns:extToolkit="http://schemas.microsoft.com/winfx/2006/xaml/presentation/toolkit/extended"
        WindowStyle="None"
        AllowsTransparency="True"
        BorderThickness="0"
        Title=""
        WindowStartupLocation="CenterOwner"
        ShowInTaskbar="False"
        Background="Transparent" 
        d:DesignWidth="200" 
        d:DesignHeight="200"
        MaxWidth="250"
        MaxHeight="250">
  <xctk:BusyIndicator IsBusy="True"
                      HorizontalAlignment="Center"
                      VerticalAlignment="Center"></xctk:BusyIndicator>
</Window>

Проблема в том, что BusyIndicator не предназначен для использования в отдельном окне

BusyIndicator является ContentControl.Это означает, что BusyIndicator может содержать один дочерний элемент в его открывающих и закрывающих тегах.

Кроме того, если вы это сделаете, первое, что показывается, это небольшой элемент управления пользовательского интерфейса (12x12 пикселей) ипосле некоторой задержки, наконец, отображается индикатор выполнения / индикатор занятости.

Указав SizeToContent='WidthAndHeight', xaml автоматически изменяет высоту и ширину относительно содержимого.В этом случае (12x12) осуществляется управление пользовательским интерфейсом, и через некоторое время ожидания, наконец, как указано выше, отображается индикатор занятости.Но к тому времени рендерер xaml ui уже применил SizeToContent, и поэтому вам пришлось бы вручную перемещать индикатор выполнения.

Я не совсем уверен, как рендеринг xaml ui работает без указания SizeToContent, но, видимо, он корректно перемещает индикатор занятости после его показа.

...