我的应用有一个窗口,我将一个带页面的框架放入网格中。比在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
}
}
}
答案 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());
}
}