我有一个场景,我需要在Web窗体页面中打开新的WPF窗口,并在该窗口中绑定10个特性并在更新面板中显示,因此网页上的数据随WPF中的用户输入而变化窗口。
我试过这样的事情:
public partial class WorkerPanel : System.Web.UI.Page
{
private MainWindow _mainWindow;
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
_mainWindow = new MainWindow();
_mainWindow.Show();
}
}
protected override void OnPreRender(EventArgs e)
{
base.OnPreRender(e);
rptTransactions.DataSource = _mainWindow.Distributors;
rptTransactions.DataBind();
}
}
但它给了我以下错误:
调用线程必须是STA,因为许多UI组件都需要这个。
根据这个问题https://stackoverflow.com/questions/2329978,我将我的代码更改为:
Thread t = new Thread(() =>
{
_mainWindow = new MainWindow();
_mainWindow.Show();
System.Windows.Threading.Dispatcher.Run();
});
t.SetApartmentState(ApartmentState.STA);
t.IsBackground = true;
t.Start();
有了这个,我的网页和WPF窗口加载正常,但我无法绑定到此窗口属性,因为它在新线程中运行。这样的约束是否可能,或者我应采取不同的方法?
答案 0 :(得分:0)
我设法用回调方式做到了。对于任何有同样问题的人来说,我做了什么:
首先,我在WPF窗口类中添加了一个委托
public delegate void DistributorsDataCallback(List<DistributorHandler> distributors);
private DistributorsDataCallback _callback;
然后我为我的窗口创建了一个新的构造函数,接受这个委托作为参数
public MainWindow(DistributorsDataCallback callbackDelegate)
{
InitializeComponent();
InitializeDistributors();
_callback = callbackDelegate;
}
和代码中的somwhere我用想传递的数据调用它
_callback(Distributors);
在我的Web表单页面上:
Thread t = new Thread(() =>
{
MainWindow _mainWindow = new MainWindow(GetDistributorsData);
_mainWindow.Show();
System.Windows.Threading.Dispatcher.Run();
});
t.SetApartmentState(ApartmentState.STA);
t.IsBackground = true;
t.Start();
现在可以在GetDistributorsData函数中轻松接收数据。 此解决方案应适用于任何多线程应用程序。