locked
如何在类中获取当前Page对象 RRS feed

  • 问题

  • 我在窗体上调用了异步操作(如网络请求),希望在异步操作后,更改当前窗口通知属性的值。

    我的问题是:如何在类中获取当前窗口对象。

    request.BeginGetResponse(new AsyncCallback((result)=>{         
        ……
        try{        
    ……
            Deployment.Current.Dispatcher.BeginInvoke(() => {
                //要在此处获取当前窗体对象
            });
        }catch (Exception ex){
    Console.WriteLine(ex);
        }
    }),new object());


    Sonny.Lin

    2015年5月19日 8:18

答案

  • 你好 qing2000,

    一般来说前台界面应该绑定到后台数据源,对于后台数据源来说,你可以在代码任意地方修改。

    比如说像MVVM的模式,我们这里可以通过viewModel来把Model绑定到View里面,如果我们修改Model里面的数据,那么View上对应的数据也会更改,这样就不会出现你当前这个问题。

    另外,如果代码并非当前page的cs文件里面,我不建议直接通过Page来修改UI。

    --James


    We are trying to better understand customer views on social support experience, so your participation in this interview project would be greatly appreciated if you have time. Thanks for helping make community forums a great place.
    Click HERE to participate the survey.

    2015年5月22日 2:19
    版主
  • 你好 qing2000,

    如果业务操作要通过异步执行,比如请求web service资源,当异步请求获得结果后,再更改ViewModel中的通知属性,就会发生错误。因为跨线程了。

    -> 对,差不多可以这么理解。

    不过我看了你的代码之后有点奇怪,首先,你写了一个WeatherDetail的类,作用是存放某个地区的天气信息吧,但是里面可以调用某些方法又生成一个WeatherDetail,然后你不把这个WeatherDetail传出来,反而在里面通过某些逻辑来尝试修改XAML页面,导致跨线程出错。

    我的建议是这样的

    1,WeatherDetail类就用作Model,作用就是存放某地天气信息。

    2,把WeatherDetail类里面的 GetDetail() 方法封装到另外一个类里面,以区分WeatherDetail

    3,GetDetail() 既然有返回值,那么在WeatherPage.xaml.cs 里面代码可以更改成这样的:

            protected override void OnNavigatedTo(NavigationEventArgs e) {
                base.OnNavigatedTo(e);
                _regionCode = this.NavigationContext.QueryString["regionCode"];
                RegionWeather.RegionCode = _regionCode;
                var result = WeatherDetail.GetDetail(RegionWeather);
                //。。。更新UI。。。
            }

    当然,如果你想通过GetDetail() 来更新UI的话,需要把View 当成一个 参数传到viewModel里面,比如说让View继承与IView,然后生成viewModel的时候把view对象传进来,具体可以参考: http://stackoverflow.com/questions/14236222/

    --James


    We are trying to better understand customer views on social support experience, so your participation in this interview project would be greatly appreciated if you have time. Thanks for helping make community forums a great place.
    Click HERE to participate the survey.



    2015年5月26日 7:01
    版主

全部回复

  • 你好 qing2000,

    你这段代码的位置在哪里,如果是在某个Page的cs文件里面的话,可以直接用 this来代表当前Page。

    另外,你提到的窗体是什么意思?是Winform还是WPF的意思?我可以帮你move到对应的论坛。

    --James


    We are trying to better understand customer views on social support experience, so your participation in this interview project would be greatly appreciated if you have time. Thanks for helping make community forums a great place.
    Click HERE to participate the survey.

    2015年5月20日 1:28
    版主
  • 我做的是Windows phone8项目,某个Page中调用了外部类,希望在外部类中获取当前的Page。


    Sonny.Lin

    2015年5月20日 1:53
  • page总不能变出来?你传一个page的引用给你需要用page的类不就可以了?

    825386224@qq.com

    2015年5月20日 5:51
  • 在没有办法获取的情况下只能传递Page的引用了。

    不过都照你这么做,微软也不需要类似WPF的App.Current.MainWindow的属性了,都可以通过传递引用获取。


    Sonny.Lin

    2015年5月20日 13:18
  • 你好 qing2000,

    一般来说前台界面应该绑定到后台数据源,对于后台数据源来说,你可以在代码任意地方修改。

    比如说像MVVM的模式,我们这里可以通过viewModel来把Model绑定到View里面,如果我们修改Model里面的数据,那么View上对应的数据也会更改,这样就不会出现你当前这个问题。

    另外,如果代码并非当前page的cs文件里面,我不建议直接通过Page来修改UI。

    --James


    We are trying to better understand customer views on social support experience, so your participation in this interview project would be greatly appreciated if you have time. Thanks for helping make community forums a great place.
    Click HERE to participate the survey.

    2015年5月22日 2:19
    版主
  • 你说的是通常的做法。

    如果业务操作要通过异步执行,比如请求web service资源,当异步请求获得结果后,再更改ViewModel中的通知属性,就会发生错误。因为跨线程了。

    http://pan.baidu.com/s/1bnHFycZ的例子。

    例子中我把后置代码当成ViewModel,用DataContext="{Binding RelativeSource={RelativeSource Self}}"进行绑定。在WeatherPage.xaml.cs的OnNavigatedTo中进行异步请求WeatherDetail.GetDetail(RegionWeather),将通知属性RegionWeather作为属性传递,如果不使用Deployment.Current.Dispatcher.BeginInvoke(() => {})方式就会抛异常。

    现在,我觉得应该在ViewModel中异步调用web service请求,等Execute完成后再更改通知属性。


    Sonny.Lin

    2015年5月22日 8:00
  • 你好 qing2000,

    如果业务操作要通过异步执行,比如请求web service资源,当异步请求获得结果后,再更改ViewModel中的通知属性,就会发生错误。因为跨线程了。

    -> 对,差不多可以这么理解。

    不过我看了你的代码之后有点奇怪,首先,你写了一个WeatherDetail的类,作用是存放某个地区的天气信息吧,但是里面可以调用某些方法又生成一个WeatherDetail,然后你不把这个WeatherDetail传出来,反而在里面通过某些逻辑来尝试修改XAML页面,导致跨线程出错。

    我的建议是这样的

    1,WeatherDetail类就用作Model,作用就是存放某地天气信息。

    2,把WeatherDetail类里面的 GetDetail() 方法封装到另外一个类里面,以区分WeatherDetail

    3,GetDetail() 既然有返回值,那么在WeatherPage.xaml.cs 里面代码可以更改成这样的:

            protected override void OnNavigatedTo(NavigationEventArgs e) {
                base.OnNavigatedTo(e);
                _regionCode = this.NavigationContext.QueryString["regionCode"];
                RegionWeather.RegionCode = _regionCode;
                var result = WeatherDetail.GetDetail(RegionWeather);
                //。。。更新UI。。。
            }

    当然,如果你想通过GetDetail() 来更新UI的话,需要把View 当成一个 参数传到viewModel里面,比如说让View继承与IView,然后生成viewModel的时候把view对象传进来,具体可以参考: http://stackoverflow.com/questions/14236222/

    --James


    We are trying to better understand customer views on social support experience, so your participation in this interview project would be greatly appreciated if you have time. Thanks for helping make community forums a great place.
    Click HERE to participate the survey.



    2015年5月26日 7:01
    版主