none
内如何与宿主窗体控件交互?? RRS feed

  • 问题

  • 服务操作方法ClassServer.cs 是文件传输的方法和宿主在一个项目内,当接受完文件后,如何更新宿主界面上的控件属性?

    宿主:

    ===============

    <Window x:Class="WpfApplication1.MainWindow"
            xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
            xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
            Title="MainWindow" Height="350" Width="525">
        <Grid>
            <Button Content="打开服务" Height="23"   Name="BtnOpenServer" VerticalAlignment="Top" Width="75" Click="BtnOpenServer_Click" />
            <Image Height="150"  Name="image1"  Width="200" />
        </Grid>
    </Window>
    

     

    CS:

    namespace WpfApplication1
    {
        /// <summary>
        /// MainWindow.xaml 的交互逻辑
        /// </summary>
        public partial class MainWindow : Window
        {
            public MainWindow()
            {
                InitializeComponent();
            }
    
            private void BtnOpenServer_Click(object sender, RoutedEventArgs e)
            {
                //使用 ServiceHost 对象加载服务、配置终结点、应用安全设置并启用侦听程序来处理传入的请求。
            }
        }
      
    }
    
    

     

    ======

    传输文件的服务方法:

    using System.Linq;
    using System.Text;
    
    namespace WpfApplication1
    {
        class ClassServer : ITransfer
        {
            public void TransferFile(FileTransferMessage request)
            {
                     / /开始接收图片文件
                。。。。。。。
                //接受图片文件完毕,文件名:
                //问??文件接收完毕,如何更新宿主MainWindow上的image1.Source
            }
        }
    }
    


    如果接收图片存储位置:D:\123.PNG

    如何更新MainWindow上的图片image1.Source,显示出来

    2011年11月14日 11:24

答案

  • 其实你的问题归根结底就是一个如何用C#代码将图片加载到Image控件上的问题,和什么宿主还有服务器传输无关。

    参考这个代码:

    BitmapImage bi = new BitmapImage(new Uri("....../myImage.png", UriKind.RelativeOrAbsolute));
    
    image1.Source = bi;
    

    请详细阅读关于 Pack Uri 的内容,这个很重要:http://msdn.microsoft.com/zh-cn/library/aa970069.aspx


    Bob Bao [MSFT]
    MSDN Community Support | Feedback to us
    2011年11月14日 16:53
    版主
  • 首先,你的 InitLog(string str) 方法是不是public的?然后你在ClassServer 类里面是否有 MainWindow 对象,就像你之前一个帖子那样,你可以通过 (MainWindow)App.Current.MainWindow 拿到MainWindow对象。 然后直接调用就可以了。

    MainWindow m = (MainWindow)App.Current.MainWindow;
    

    m.InitLog(...);
    


    Sincerely,


    Bob Bao [MSFT]
    MSDN Community Support | Feedback to us
    2011年11月16日 3:32
    版主

全部回复

  • 其实你的问题归根结底就是一个如何用C#代码将图片加载到Image控件上的问题,和什么宿主还有服务器传输无关。

    参考这个代码:

    BitmapImage bi = new BitmapImage(new Uri("....../myImage.png", UriKind.RelativeOrAbsolute));
    
    image1.Source = bi;
    

    请详细阅读关于 Pack Uri 的内容,这个很重要:http://msdn.microsoft.com/zh-cn/library/aa970069.aspx


    Bob Bao [MSFT]
    MSDN Community Support | Feedback to us
    2011年11月14日 16:53
    版主
  • 可能我没表述清楚。为了提问方便简化了一下。呵呵。

    我本意是这样的:客户端向服务端发送文件,文件信息(文件名,大小等等)在宿主界面上体现出来。

    在ClassServer.cs里调用 MainWindow.cs委托,更新MainWindowUI

    传输文件的服务方法:
    
    using System.Linq;
    using System.Text;
    
    namespace WpfApplication1
    {
        class ClassServer : ITransfer
        {
            public void TransferFile(FileTransferMessage request)
            {
                     / /开始接收图片文件
                。。。。。。。
                //接受图片文件完毕,文件名:
                //问??123.jpg文件接收完毕,将文件名传给MainWindow.cs委托更新宿主MainWindow上的image1.Source
            }
        }
    }
    
    

    //文件名123.jpg是在这里得到的,怎么通知给MainWindow.cs

     



    • 已编辑 WCF小Q 2011年11月15日 12:26
    2011年11月15日 12:16
  • 用绑定,数据源实现INotifyPropertyChanged接口,UI会自动更新。


    Sheldon _Xiao[MSFT]
    MSDN Community Support | Feedback to us
    Get or Request Code Sample from Microsoft
    Please remember to mark the replies as answers if they help and unmark them if they provide no help.

    2011年11月15日 13:28
    版主
  • 不好意思,其实我还是没有明白 你的意思,看上去根本就没有问题啊? 通知MainWindow不就只要直接 访问他里面 的 控件 然后设置属性就可以了。如果 你使用了委托,那么你也可以通过调用 MainWindow.Dispatcher.Invoke(...) 来调用一个方法 去更新MianWindow。

    我觉得你的 通知 实质就是调用 MainWindow中的一个自己的方法而已,可能一下子没有转过弯来。


    Bob Bao [MSFT]
    MSDN Community Support | Feedback to us
    • 已标记为答案 WCF小Q 2011年11月15日 17:19
    • 取消答案标记 WCF小Q 2011年11月15日 18:02
    2011年11月15日 15:49
    版主
  • Sheldon _Xiao,多谢~~~
    2011年11月15日 17:05
  • Bob Bao  呵呵呵~~~是是是“实质就是调用 MainWindow中的一个自己的方法而已”

     

    MainWindow.cs里面有一个

     public  void InitLog(string str)
            {
                         
                txtboxLog.Dispatcher.BeginInvoke(
                    DispatcherPriority.Normal, new Action(() =>
                    {
                        this.txtboxLog.Text = "状态信息:\n"+str+"\n";
                    }));
              
            }

    然后在下面

    namespace WpfApplication1
    {
        class ClassServer : ITransfer
        {
            public void TransferFile(FileTransferMessage request)
            {
                     //开始接收图片文件
                。。。。。。。
                //接受图片文件完毕
                //??这里,调用MainWindow.cs里面InitLog(string str),怎么写?

            }
        }
    }

    • 已编辑 WCF小Q 2011年11月15日 18:07
    2011年11月15日 17:13
  • 首先,你的 InitLog(string str) 方法是不是public的?然后你在ClassServer 类里面是否有 MainWindow 对象,就像你之前一个帖子那样,你可以通过 (MainWindow)App.Current.MainWindow 拿到MainWindow对象。 然后直接调用就可以了。

    MainWindow m = (MainWindow)App.Current.MainWindow;
    

    m.InitLog(...);
    


    Sincerely,


    Bob Bao [MSFT]
    MSDN Community Support | Feedback to us
    2011年11月16日 3:32
    版主
  • 那请问:如果想在类中调用宿主窗体里的控件方法要怎样实现?

    或者说这样的做法本身就不值得提倡?

    2012年7月8日 1:54
  • 你必须得有宿主窗体的对象才可以调用,不是不提倡,只要这个需求符合你的要求,那么就是可以做的。你可以在创建类对象的时候将宿主窗体对象传递给这个类或者你可以通过一个中介静态的窗体管理类,将你的宿主窗体在一打开的时候就添加到窗体管理类的一个集合中,这样你可以在任何时候通过这个集合找到你的宿主窗体对象,并且去使用。

    Bob Bao [MSFT]
    MSDN Community Support | Feedback to us

    2012年7月9日 4:03
    版主