WPF ShowDialog - 更改父 window 的光标

WPF ShowDialog - change parent window's cursor

我在用 ShowDialog 打开 window 时遇到了一点问题。

我有一个主要 window,当应用程序从数据源加载数据时,它会打开另一个小 window 作为对话框来显示加载进度。

当小加载进度 window 打开时,window 的光标设置为自定义忙碌光标,我正在尝试设置主 window 的光标和小载一样window,但是不管我怎么试都不行

我知道当用 ShowDialog 打开一个 window 作为对话框时,打开 window 的光标被设置为正常的默认光标(当鼠标悬停在你的对话框上时,你有选定的光标,但是当对话框打开时悬停在主 window 上时,光标设置为默认光标 [arrow])。 我试图让我的应用程序在加载对话框打开时显示相同的自定义忙碌光标,同时将鼠标悬停在对话框本身和已打开对话框的 window 上,同时阻止用户访问主 window的内容,防止最小化小载window,防止让小载window在主window.

  1. 在使用 ShowDialog 或类似于 ShowDialog 的东西时,有什么方法可以做到这一点(如上所述)吗?
  2. 有没有办法改变 ENTIRE 应用程序的默认光标(例如自定义箭头光标而不是 windows 默认的光标)?
  3. 有没有什么方法可以打开一个对话框,将它的光标设置为自定义忙碌光标,然后将该光标设置为在悬停在应用程序的任何部分上时出现?

我的代码:

private void Window_ContentRendered(object sender, EventArgs e)
        {
            Mouse.OverrideCursor = new Cursor(System.IO.Path.GetFullPath(System.IO.Path.Combine(strCurrentDir, @"..\..\")) + @"Cursors\busy.ani");
            //this.Cursor = new Cursor(System.IO.Path.GetFullPath(System.IO.Path.Combine(strCurrentDir, @"..\..\")) + @"Cursors\busy.ani");
            //Mouse.OverrideCursor = Cursors.Wait;

            bwReload = new BackgroundWorker();
            bwReload.WorkerReportsProgress = true;
            bwReload.DoWork += (sender_bw, e_bw) =>
            {
                new Thread(() =>
                {
                    Application.Current.Dispatcher.Invoke(() => 
                    {
                        ProgressBarWindow pbwLoadWindow = new ProgressBarWindow("Loading...", this);
                        pbwLoadWindow.ShowInTaskbar = false;
                        pbwLoadWindow.Owner = this;
                        pbwLoadWindow.Cursor = new Cursor(System.IO.Path.GetFullPath(System.IO.Path.Combine(strCurrentDir, @"..\..\")) + @"Cursors\busy.ani");
                        pbwLoadWindow.ShowDialog();
                    });
                }).Start();

                ReloadA();
                ReloadB();
            };
            bwReload.RunWorkerCompleted += (sender_bw, e_bw) => btnViewDashboard_Click(this, null);

            bwReload.RunWorkerAsync();
        }

提前致谢。

已解决

很简单。

您需要做的就是转到对话框 window 的 xaml 并像这样安装 window,它将覆盖整个主要 window .

代码:

<Window x:Class="PlGui.ProgressBarWindow"
        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:local="clr-namespace:PlGui"
        mc:Ignorable="d" Height="600" Width="1025"
        ResizeMode="NoResize" WindowStartupLocation="CenterScreen"
        WindowStyle="None" AllowsTransparency="True">

    <Window.Background>
        <SolidColorBrush Opacity="0.01" Color="White"/>
    </Window.Background>

    <Grid Height="100"
          Width="350"
          HorizontalAlignment="Center"
          VerticalAlignment="Center"
          Background="#7f8c8d">
         ......
    </Grid>

</Window>

结果: