如何让 BusyIndicator 居中到 MainWindow 的中心?
How to center BusyIndicator to the center of MainWindow?
我创建了示例 Wpf 应用程序并安装了扩展 WPF 工具包(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>
显示进度 window 使用此代码触发:
private void Button_Click(object sender, RoutedEventArgs e)
{
Progress w = new Progress
{
Owner = Application.Current.MainWindow,
WindowStartupLocation = WindowStartupLocation.CenterOwner
};
w.Show();
}
我的问题很简单。如何在主窗口屏幕中间显示 BusyIndicator。如下图所示,它没有居中。请注意,我使用 SizeToContent="WidthAndHeight"
通过删除 Window.SizeToContent
属性 并向 BusyIndicator 添加 VerticalAlignment
和 HorizontalAlignment
属性来解决它(实际上现在我使用了微调器,但这并没有使任何解决方案的差异)。
<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
The BusyIndicator is a ContentControl. What this means is that the BusyIndicator can contain a single child element within it?s open and closing tags.
此外,如果您这样做,首先显示的是小 ui 控件(12x12 像素),经过一些延迟后,最后会显示进度 bar/busy 指示器。
通过指定 SizeToContent='WidthAndHeight'
,xaml 会根据内容自动调整高度和宽度。在这种情况下,采用 (12x12) ui 控制,并且经过一段时间的等待时间后,最终如上文所述显示忙碌指示器。但到那时,xaml ui 渲染器已经应用 SizeToContent
因此您必须手动重新定位进度条。
我不太确定 xaml ui renderes 在不指定 SizeToContent
的情况下是如何工作的,但显然它会在显示忙碌指示器后正确地重新定位它。
有一个单独的 window 来显示忙碌指示器,这将导致不需要的行为。如果原始 window 被最大化、移动等会发生什么?
考虑将忙碌指示器添加到主屏幕。通常我会创建一个覆盖区域,用于显示消息对话框、进度条等。
<Window>
<Grid>
<Application stuff ....>
</Application stuff>
<ContentControl regions:RegionManager.RegionName="OverlayRegion"
HorizontalAlignment="Stretch"
VerticalAlignment="Stretch" />
</Grid>
</Window>
我在这里使用 Prism,但您可以用任何东西替换 ContentControl,例如 BusyIndicator 并控制控件的可见性。
我创建了示例 Wpf 应用程序并安装了扩展 WPF 工具包(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>
显示进度 window 使用此代码触发:
private void Button_Click(object sender, RoutedEventArgs e)
{
Progress w = new Progress
{
Owner = Application.Current.MainWindow,
WindowStartupLocation = WindowStartupLocation.CenterOwner
};
w.Show();
}
我的问题很简单。如何在主窗口屏幕中间显示 BusyIndicator。如下图所示,它没有居中。请注意,我使用 SizeToContent="WidthAndHeight"
通过删除 Window.SizeToContent
属性 并向 BusyIndicator 添加 VerticalAlignment
和 HorizontalAlignment
属性来解决它(实际上现在我使用了微调器,但这并没有使任何解决方案的差异)。
<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
The BusyIndicator is a ContentControl. What this means is that the BusyIndicator can contain a single child element within it?s open and closing tags.
此外,如果您这样做,首先显示的是小 ui 控件(12x12 像素),经过一些延迟后,最后会显示进度 bar/busy 指示器。
通过指定 SizeToContent='WidthAndHeight'
,xaml 会根据内容自动调整高度和宽度。在这种情况下,采用 (12x12) ui 控制,并且经过一段时间的等待时间后,最终如上文所述显示忙碌指示器。但到那时,xaml ui 渲染器已经应用 SizeToContent
因此您必须手动重新定位进度条。
我不太确定 xaml ui renderes 在不指定 SizeToContent
的情况下是如何工作的,但显然它会在显示忙碌指示器后正确地重新定位它。
有一个单独的 window 来显示忙碌指示器,这将导致不需要的行为。如果原始 window 被最大化、移动等会发生什么?
考虑将忙碌指示器添加到主屏幕。通常我会创建一个覆盖区域,用于显示消息对话框、进度条等。
<Window>
<Grid>
<Application stuff ....>
</Application stuff>
<ContentControl regions:RegionManager.RegionName="OverlayRegion"
HorizontalAlignment="Stretch"
VerticalAlignment="Stretch" />
</Grid>
</Window>
我在这里使用 Prism,但您可以用任何东西替换 ContentControl,例如 BusyIndicator 并控制控件的可见性。