如何将BusyIndi​​cator居中到MainWindow的中心?

时间:2019-03-05 09:51:51

标签: wpf wpftoolkit

我创建了示例Wpf应用程序并安装了Extended WPF Toolkit(NuGet软件包)。这是我的xaml代码,用于显示BusyIndi​​cator。

<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();
}

我的问题很简单。如何在MainWindow屏幕的中间显示BusyIndi​​cator。如下图所示,它没有居中对齐。请注意,我使用SizeToContent="WidthAndHeight"

enter image description here

2 个答案:

答案 0 :(得分:2)

有一个单独的窗口来显示忙碌指示器,这将导致不想要的行为。如果原始窗口最大化,移动等,会发生什么?

考虑将忙碌指示器添加到主屏幕。通常,我会创建一个覆盖区域,用于显示消息对话框,进度条等。

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

我在这里使用Prism,但是您可以将ContentControl替换为诸如BusyIndi​​cator之类的任何东西,并操纵控件的可见性。

答案 1 :(得分:-1)

通过删除Window.SizeToContent属性并向BusyIndi​​cator添加VerticalAlignmentHorizontalAlignment属性来解决它(实际上我现在使用了微调器,但这在解决方案中没有任何区别)。

<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 was not designed to use it in separate window

  

BusyIndi​​cator是一个ContentControl。这意味着BusyIndi​​cator可以在其打开和关闭标记中包含单个子元素。

如果这样做,首先显示的是小型ui控件(12x12像素),经过一段时间的等待后,最终会显示进度条/忙碌指示器。

通过指定SizeToContent='WidthAndHeight',xaml会自动调整相对于内容的高度和宽度。在这种情况下,将采用(12x12)ui控制,最后经过一段时间的等待时间后,如上所述会显示繁忙指示器。但是到那时,xaml ui渲染器已经应用了SizeToContent,因此您必须手动重新定位进度条。

我不确定在不指定SizeToContent的情况下xaml ui渲染的工作原理,但是显然在显示后,忙指示器会正确地重新放置。