窗口上的线程窗口距离有多近?

时间:2015-08-13 14:23:16

标签: c# wpf multithreading xaml mvvm

我的应用有一个窗口,我将一个带页面的框架放入网格中。比在Page1.cs中我用“while”开始线程。执行后,必须关闭带页面的窗口。

我无法使用此方法Application.Current.Shutdown()

因为这会关闭所有窗口,所以如果我在我的应用程序中有几个窗口,在此方法之后所有窗口都将关闭。

我想过使用MVVM,但我不知道怎么做。

我想从页面上的线程关闭一个窗口(例如在方法update()中)

MainWindow.xaml

<Windowx:Class="WpfApplication1.MainWindow"
  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:WpfApplication1"
  mc:Ignorable="d"
  Title="MainWindow" Height="350" Width="525">
  <Grid>
    <Frame Source "Page1.xaml">

    </Frame>
  </Grid>
</Window>

Code Page1.xaml

<Page x:Class="WpfApplication1.Page1"
  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:local="clr-namespace:WpfApplication1"
  mc:Ignorable="d" 
  d:DesignHeight="300" d:DesignWidth="300"
  Title="Page1">
  <Grid>
  </Grid>
</Page>

比我在Page1.cs中启动线程

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using System.Windows.Threading;

namespace WpfApplication1
{
    /// 
    /// Interaction logic for Page1.xaml
    /// 
    public partial class Page1 : Page
    {
        bool isTrue = false;
        int i;
        private MainWindow vm = new MainWindow();
        public Page1()
        {
            InitializeComponent();
            Thread thread = null;

            thread = new Thread(() => update());
            thread.SetApartmentState(ApartmentState.STA);
            thread.IsBackground = true;
            thread.Start();
        }

        void update()
        {

            while (i<50000)
            {
                i++;

            }
            ***//How I can close window from this place***
            Application.Current.MainWindow.Dispatcher.Invoke(DispatcherPriority.Normal, new ThreadStart(Application.Current.MainWindow.Close)); // this don't work 

        }
    }
}

1 个答案:

答案 0 :(得分:2)

您可以访问要关闭的vm(或页面)。 E.g:

vm.Dispatcher.Invoke(() => vm.Close());

从其他想法我认为这一行是你的问题

private MainWindow vm = new MainWindow();

如果您在此处创建MainWindow的另一个实例,那么显然vm是无用的,那么您必须以与您非常相似的方式执行此操作:

Application.Current.MainWindow.Dispatcher.Invoke(() =>
{
    Application.Current.MainWindow.Close();
});

我要尝试查看问题,即访问主窗口的调度程序。

这是有效的解决方案(使用UserControl,无所谓):

public partial class UserControl1 : UserControl
{
    private Dispatcher _dispatcher; // store dispatcher when constructor is called

    public UserControl1()
    {
        InitializeComponent();
        _dispatcher = Dispatcher;

        var thread = new Thread(() => update());
        thread.SetApartmentState(ApartmentState.STA);
        thread.IsBackground = true;
        thread.Start();
    }

    void update()
    {
        // simulate some work
        Thread.Sleep(1000);
        // close
        _dispatcher.Invoke(() => Application.Current.MainWindow.Close());
    }
}