从Web窗体页面访问WPF窗口属性

时间:2017-03-19 12:52:26

标签: c# asp.net .net wpf webforms

我有一个场景,我需要在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窗口加载正常,但我无法绑定到此窗口属性,因为它在新线程中运行。这样的约束是否可能,或者我应采取不同的方法?

1 个答案:

答案 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函数中轻松接收数据。 此解决方案应适用于任何多线程应用程序。