Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 显示不可见窗口_C#_Wpf_Winforms - Fatal编程技术网

C# 显示不可见窗口

C# 显示不可见窗口,c#,wpf,winforms,C#,Wpf,Winforms,我有一个有一些过程和可视化的窗口,但我希望这个窗口在启动时被隐藏,但仍然执行它的工作。我用简单的代码实现了这一点 SomeWindow.Show(); SomeWindow.Hide(); 但问题是这段代码会导致启动闪烁。无论是在Windows窗体中,还是在WPF中,我都无法解决这个问题。有没有更优雅的方式来显示隐藏/不可见的窗口 更新 我希望窗口显示在任务栏中,但仅当它是可见的。窗口正在执行依赖于渲染的任务,无论可见性如何,渲染都将及时执行,用户应该能够看到它的状态,就像它一直处于打开状态一

我有一个有一些过程和可视化的窗口,但我希望这个窗口在启动时被隐藏,但仍然执行它的工作。我用简单的代码实现了这一点

SomeWindow.Show();
SomeWindow.Hide();
但问题是这段代码会导致启动闪烁。无论是在Windows窗体中,还是在WPF中,我都无法解决这个问题。有没有更优雅的方式来显示隐藏/不可见的窗口

更新
我希望窗口显示在任务栏中,但仅当它是可见的。窗口正在执行依赖于渲染的任务,无论可见性如何,渲染都将及时执行,用户应该能够看到它的状态,就像它一直处于打开状态一样。

为什么要为此任务使用窗口?为什么不在另一个线程上启动一个类并让它完成工作呢

如果确实需要一个窗口,只需在打开该窗口时从该自定义任务请求数据即可

var myClass = new MyClass();

Task.Run(()=>myClass.Start());

为什么要使用窗口来完成此任务?为什么不在另一个线程上启动一个类并让它完成工作呢

如果确实需要一个窗口,只需在打开该窗口时从该自定义任务请求数据即可

var myClass = new MyClass();

Task.Run(()=>myClass.Start());

这在我的机器上工作,没有“闪烁”。正如Ed提到的,任务栏按钮的行为与您预期的一样,没有添加设置或代码

//Assuming SomeWindow is System.Windows.Form object
SomeWindow.Opacity = 0.0;
SomeWindow.Show();
SomeWindow.Hide();

//Elsewhere in code when you want to display the window
SomeWindow.Opacity = 1.0;
SomeWindow.Visible = true;

这在我的机器上工作,没有“闪烁”。正如Ed提到的,任务栏按钮的行为与您预期的一样,没有添加设置或代码

//Assuming SomeWindow is System.Windows.Form object
SomeWindow.Opacity = 0.0;
SomeWindow.Show();
SomeWindow.Hide();

//Elsewhere in code when you want to display the window
SomeWindow.Opacity = 1.0;
SomeWindow.Visible = true;
试试这个:

SomeWindow.ShowInTaskbar = false; // not shown on taskbar set to true if you want to show form on taskbar
SomeWindow.WindowState = FormWindowState.Minimized; // set window state as minimized
SomeWindow.Show(); 
你甚至不需要隐藏它

这是winforms版本,我没有在WPF中测试它

更新:

如果
Show()
窗口位于打开的窗口列表(Alt+Tab)上之后未执行
Hide()
。要防止这种情况,请执行以下操作:

SomeWindow.Hide(); 
试试这个:

SomeWindow.ShowInTaskbar = false; // not shown on taskbar set to true if you want to show form on taskbar
SomeWindow.WindowState = FormWindowState.Minimized; // set window state as minimized
SomeWindow.Show(); 
你甚至不需要隐藏它

这是winforms版本,我没有在WPF中测试它

更新:

如果
Show()
窗口位于打开的窗口列表(Alt+Tab)上之后未执行
Hide()
。要防止这种情况,请执行以下操作:

SomeWindow.Hide(); 
基于此,我创建了显示不可见窗口的扩展方法

对于Windows窗体:

public static class FormHelper
{
    public static void ShowInvisible(this Form form)
    {
        // saving original settings
        bool needToShowInTaskbar = form.ShowInTaskbar;
        FormWindowState initialWindowState = form.WindowState;

        // making form invisible
        form.ShowInTaskbar = false;
        form.WindowState = FormWindowState.Minimized;

        // showing and hiding form
        form.Show();
        form.Hide();

        // restoring original settings
        form.ShowInTaskbar = needToShowInTaskbar;
        form.WindowState = initialWindowState;
    }
} 
或对于WPF:

public static class WindowHelper
{
    public static void ShowInvisible(this Window window)
    {
        // saving original settings
        bool needToShowInTaskbar = window.ShowInTaskbar;
        WindowState initialWindowState = window.WindowState;

        // making window invisible
        window.ShowInTaskbar = false;
        window.WindowState = WindowState.Minimized;

        // showing and hiding window
        window.Show();
        window.Hide();

        // restoring original settings
        window.ShowInTaskbar = needToShowInTaskbar;
        window.WindowState = initialWindowState;
    }
}
基于此,我创建了显示不可见窗口的扩展方法

对于Windows窗体:

public static class FormHelper
{
    public static void ShowInvisible(this Form form)
    {
        // saving original settings
        bool needToShowInTaskbar = form.ShowInTaskbar;
        FormWindowState initialWindowState = form.WindowState;

        // making form invisible
        form.ShowInTaskbar = false;
        form.WindowState = FormWindowState.Minimized;

        // showing and hiding form
        form.Show();
        form.Hide();

        // restoring original settings
        form.ShowInTaskbar = needToShowInTaskbar;
        form.WindowState = initialWindowState;
    }
} 
或对于WPF:

public static class WindowHelper
{
    public static void ShowInvisible(this Window window)
    {
        // saving original settings
        bool needToShowInTaskbar = window.ShowInTaskbar;
        WindowState initialWindowState = window.WindowState;

        // making window invisible
        window.ShowInTaskbar = false;
        window.WindowState = WindowState.Minimized;

        // showing and hiding window
        window.Show();
        window.Hide();

        // restoring original settings
        window.ShowInTaskbar = needToShowInTaskbar;
        window.WindowState = initialWindowState;
    }
}
因为WPF是一个很好的开始,但最终对我来说不起作用,原因有两个:Show()和Hide()是同步方法,当您希望在没有其他窗口打开的情况下预创建该窗口时,这是一个问题(因为没有调度程序执行这些请求);此外,恢复原始值必须在以后执行,否则仍会出现快速闪烁。然后,我不得不异步恢复ShowInTaskbar的值;否则,任务栏条目就会丢失,但奇怪的是,只有在VisualStudio调试器中运行时才会丢失

以下帮助器类为我执行此任务:

public class InitiallyInvisibleWindow
{
  private readonly Window _window;
  private bool _origShowActivated;
  private bool _origShowInTaskbar;
  private WindowState _origWindowState;

  public InitiallyInvisibleWindow(Window window)
  {
    _window = window;
  }

  public void ShowInvisible()
  {
    _origShowActivated = _window.ShowActivated;
    _origShowInTaskbar = _window.ShowInTaskbar;
    _origWindowState = _window.WindowState;

    _window.ShowActivated = false;
    _window.ShowInTaskbar = false;
    _window.WindowState = WindowState.Minimized;

    _window.Visibility = Visibility.Visible;
    _window.Visibility = Visibility.Hidden;
  }

  public void RestoreVisible()
  {
    _window.ShowActivated = _origShowActivated;
    _window.Visibility = Visibility.Visible;

    Dispatcher.CurrentDispatcher.InvokeAsync(() =>
      {
        _window.ShowInTaskbar = _origShowInTaskbar;
        _window.WindowState = _origWindowState;
      });
  }
}
因为WPF是一个很好的开始,但最终对我来说不起作用,原因有两个:Show()和Hide()是同步方法,当您希望在没有其他窗口打开的情况下预创建该窗口时,这是一个问题(因为没有调度程序执行这些请求);此外,恢复原始值必须在以后执行,否则仍会出现快速闪烁。然后,我不得不异步恢复ShowInTaskbar的值;否则,任务栏条目就会丢失,但奇怪的是,只有在VisualStudio调试器中运行时才会丢失

以下帮助器类为我执行此任务:

public class InitiallyInvisibleWindow
{
  private readonly Window _window;
  private bool _origShowActivated;
  private bool _origShowInTaskbar;
  private WindowState _origWindowState;

  public InitiallyInvisibleWindow(Window window)
  {
    _window = window;
  }

  public void ShowInvisible()
  {
    _origShowActivated = _window.ShowActivated;
    _origShowInTaskbar = _window.ShowInTaskbar;
    _origWindowState = _window.WindowState;

    _window.ShowActivated = false;
    _window.ShowInTaskbar = false;
    _window.WindowState = WindowState.Minimized;

    _window.Visibility = Visibility.Visible;
    _window.Visibility = Visibility.Hidden;
  }

  public void RestoreVisible()
  {
    _window.ShowActivated = _origShowActivated;
    _window.Visibility = Visibility.Visible;

    Dispatcher.CurrentDispatcher.InvokeAsync(() =>
      {
        _window.ShowInTaskbar = _origShowInTaskbar;
        _window.WindowState = _origWindowState;
      });
  }
}


当我调用
Show
表单时,它将是可见的。如果没有这个调用,我的可视化和依赖过程将无法工作。但它无法解决任务栏问题(我希望此窗口显示在任务栏中)。如果确实需要调用show(),它当然会闪烁。该方法的全部目的是,好的,显示形式。。。让它可见。仅创建表单对象是否有效<代码>MyForm SomeWindow=新建MyForm()您需要触发某些事件吗?我在您的需求中看不到任何不是默认窗口行为的东西。运行窗口最小化而不在任务栏上显示如何?当我调用
Show
表单时,它将是可见的。如果没有这个调用,我的可视化和依赖过程将无法工作。但它无法解决任务栏问题(我希望此窗口显示在任务栏中)。如果确实需要调用show(),它当然会闪烁。该方法的全部目的是,好的,显示形式。。。让它可见。仅创建表单对象是否有效<代码>MyForm SomeWindow=新建MyForm()您需要触发某些事件吗?我在您的需求中看不到任何不是默认窗口行为的东西。那么运行“窗口最小化”而不在任务栏上显示它呢?因为我的任务依赖于可视化,反之亦然。因为我的任务依赖于可视化,反之亦然。这使窗口在屏幕底部成为一个可见的最小化框。然后可以将其移出可见区域,但仍可在可见窗口列表中访问,例如Alt+Tab、Win+Tab。用户仍然可以激活它。不是我不相信你,而是我没有看到这样的行为(在windows 10上)你在使用什么操作系统?也许你是在WPF项目上做的?这是第一个窗口的第二个窗口吗?第十个窗口。Winforms。任何一个窗口。我让第一个窗口正常加载,然后在事件上加载第二个窗口。但是,如果我更改第一个窗口,使其具有您指定的属性,它也会执行相同的操作——唯一的区别是它在所有其他窗口之后启动。如果最小化或移动其他窗口,您将找到它。即使没有,它仍应出现在Alt+Tab窗口列表中。@CPerkins您关于Alt+Tab的看法是正确的,要防止这种行为,您需要执行
SomeWindow.Hide()节目结束后。但是我找不到我喜欢的这扇小窗户。另外,我知道你可以从Alt+Tab列表中删除窗口(甚至完全显示在屏幕上),就像我以前做的那样,但现在我不记得怎么做了。有趣的是,下次我重新运行程序时