none
如何为WPF创建一个合适的配置文件? RRS feed

  • 问题

  • 我想为我的WPF程序创建一个配置文件,其中既能够保留一般的string类型数据,也想保存窗口的布局,以方便下一次打开程序时,自动恢复到之前的模样。

    还有譬如System.Windows.Shapes.Path等类型,这些特殊的数据,也能够保存其中,不知道WPF 有没有办法实现?

    请教大家了啊!


    Best Regards! C.Lu
    2011年2月17日 8:17

答案

  • 你好,

    是这样的,如果你需要保存一些窗口的布局之类的东西, 不一定要像你提到的那样,用什么配置文件,因为WPF对于配置文件没有什么特殊的。

    对于如何更好的满足的你需求,我觉得你完全可以将你想要保存的东西存储到文件当中,至于什么文件,就有很多种了,我推荐你用Xml文件保存,因为Xml文件的序列化和反序列化做的很好,我觉得就可以满足你的要求了。

    我觉得相关资料比较多,你完全可以到网上搜WPF序列化反序列化的知识,这样你就可以把想要保存的东西 写到Xml中去,然后想要读的时候再从Xml中读取出来。

     

    Best regards,


    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年2月18日 4:54
    版主
  • 你好,

    参考下面这个直接运行的例子,这个例子是Bob Bao设计的,也是他写的代码,他用一个Class去存储需要保存的属性,然后将这些数据保存到了Xaml文件中,Xaml文件时WPF的特性,比Xml文件要好操作许多,然后通过TwoWay的绑定去完成设置与读取。

    你可以下载这个例子,链接是:

    http://cid-41e44c402aaada87.office.live.com/self.aspx/WPFSaveWindowsConfiguration/WPFSaveWindowsConfiguration.zip

    同时感谢Bob Bao.

     

    Best regards,


    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年2月18日 17:20
    版主
  • 版主,您好!

    感谢你耐心的回复。

    首先,你给的Bob Bao编写的例子,我运行了一下,发现有一个小问题,App.xmal.cs中,

                foreach (Window window in this.Windows)
                {
                    window.Closing += new System.ComponentModel.CancelEventHandler(window_Closing);

                }

    这段代码没有效果,因为this.Windows不能列举出包含的窗口。因此,每次关闭窗口时,数据不会保存到WindowsSettings文件中。我是把window_Closing函数添加到每个窗口的后台代码中,就可以实现期望的效果了。

    其次,例子中窗口较简单,因此,保存的数据也少,可以用这种办法,但是,我要实现的项目,窗口比较复杂,所以我在考虑用XML文件保存配置。通过XamlWriter.Save(),我实现了将窗口布局保存到xml文件。再次初始化窗口的时候,应该再加载该文件,但是总是出错,摸不到头绪,还请您指导!

    谢谢!


    Best Regards! C.Lu
    2011年2月21日 5:06
  • 你好,

    你完全可以将你想保存的属性保存到你自己的类中,比如Class Data,保存到Xml文件或者其他文件后,下次对这个Xml进行绑定就行了啊。

    参考相关:XmlWriter,XmlReader, XamlWriter, XamlReader,

    http://msdn.microsoft.com/zh-cn/library/system.windows.markup.xamlwriter.aspx

    http://msdn.microsoft.com/zh-cn/library/system.windows.markup.xamlreader.aspx

    如果觉得有点头绪了 就尝试着写一写,如果觉得还是没有头绪,只能我给你写一个例子了。

     

    Best regards,


    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年2月18日 8:37
    版主

全部回复

  • 最好有例程,能够研究一下


    Best Regards! C.Lu
    2011年2月17日 8:18
  • 没有人回答啊。

    我知道一种方法,右键点击资源管理器中的项目,然后选择属性选项,在属性选项卡中选择设置。在里面可以设置一些类型的变量,用作配置文件,下一次启动的时候,就可以通过代码加载。

    但是这种方法,我不清楚如何保存窗口的布局(包括,大小,尺寸,窗口中grid的设置等),而且好像也不能保存 数组。比如 double类型,可以设置一个配置文件,但是double[]好像就不可以。

    不知道是这个问题太简单,还是我没说清楚。

    总之,期待高人解答!


    Best Regards! C.Lu
    2011年2月18日 3:25
  • 你好,

    是这样的,如果你需要保存一些窗口的布局之类的东西, 不一定要像你提到的那样,用什么配置文件,因为WPF对于配置文件没有什么特殊的。

    对于如何更好的满足的你需求,我觉得你完全可以将你想要保存的东西存储到文件当中,至于什么文件,就有很多种了,我推荐你用Xml文件保存,因为Xml文件的序列化和反序列化做的很好,我觉得就可以满足你的要求了。

    我觉得相关资料比较多,你完全可以到网上搜WPF序列化反序列化的知识,这样你就可以把想要保存的东西 写到Xml中去,然后想要读的时候再从Xml中读取出来。

     

    Best regards,


    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年2月18日 4:54
    版主
  • 版主,你好!

    我找了一些关于Xml文件序列化反序列化的文章,感觉都不全面。

    能否有一个可以说明问题的例子,看一下呢?

    谢谢!


    Best Regards! C.Lu
    2011年2月18日 5:27
  • 你好,

    你完全可以将你想保存的属性保存到你自己的类中,比如Class Data,保存到Xml文件或者其他文件后,下次对这个Xml进行绑定就行了啊。

    参考相关:XmlWriter,XmlReader, XamlWriter, XamlReader,

    http://msdn.microsoft.com/zh-cn/library/system.windows.markup.xamlwriter.aspx

    http://msdn.microsoft.com/zh-cn/library/system.windows.markup.xamlreader.aspx

    如果觉得有点头绪了 就尝试着写一写,如果觉得还是没有头绪,只能我给你写一个例子了。

     

    Best regards,


    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年2月18日 8:37
    版主
  • 你好,

    参考下面这个直接运行的例子,这个例子是Bob Bao设计的,也是他写的代码,他用一个Class去存储需要保存的属性,然后将这些数据保存到了Xaml文件中,Xaml文件时WPF的特性,比Xml文件要好操作许多,然后通过TwoWay的绑定去完成设置与读取。

    你可以下载这个例子,链接是:

    http://cid-41e44c402aaada87.office.live.com/self.aspx/WPFSaveWindowsConfiguration/WPFSaveWindowsConfiguration.zip

    同时感谢Bob Bao.

     

    Best regards,


    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年2月18日 17:20
    版主
  • 版主,您好!

    感谢你耐心的回复。

    首先,你给的Bob Bao编写的例子,我运行了一下,发现有一个小问题,App.xmal.cs中,

                foreach (Window window in this.Windows)
                {
                    window.Closing += new System.ComponentModel.CancelEventHandler(window_Closing);

                }

    这段代码没有效果,因为this.Windows不能列举出包含的窗口。因此,每次关闭窗口时,数据不会保存到WindowsSettings文件中。我是把window_Closing函数添加到每个窗口的后台代码中,就可以实现期望的效果了。

    其次,例子中窗口较简单,因此,保存的数据也少,可以用这种办法,但是,我要实现的项目,窗口比较复杂,所以我在考虑用XML文件保存配置。通过XamlWriter.Save(),我实现了将窗口布局保存到xml文件。再次初始化窗口的时候,应该再加载该文件,但是总是出错,摸不到头绪,还请您指导!

    谢谢!


    Best Regards! C.Lu
    2011年2月21日 5:06
  • 你好,

    你说的对!那个例子的确存在你说的问题,感谢你对例子的改正。

    关于你说的摸不到头脑,我这边暂时只能给你提供一些参考文章,因为我这儿没有现成的例子。

    http://support.microsoft.com/kb/815813

    http://www.switchonthecode.com/tutorials/csharp-tutorial-xml-serialization

    你先参考着上面的例子去完成,等我有空会写一个这样的例子,然后再更新这个帖子。

     

    Best regards,


    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年2月21日 5:31
    版主
  • 好的,感谢您的回复,给了我们使用WPF的信心!
    Best Regards! C.Lu
    2011年2月21日 5:50
  • Sheldon_Xiao版主,您好!

    关于我提出的这个问题,目前我有了一个解决思路。

    首先,把窗口的主要属性,比如大小,起始位置等,仿照Bob Bao的例程,进行存储。在下一次打开的时候,主窗口可以恢复到上一次的概貌。

    其次,因为布局的时候,所有控件都在一个grid中,把这个grid写入一个xml文件。当应用程序加载MainWindow.xmal.cs之后,先remove这个控件(grid),再从xml文件中读入上一次存储的关于grid的xmal内容,显式转化为grid,如下代码:

            StringReader stringReader = new StringReader(data);//data中是存储的xmal内容
            XmlReader xmlReader = XmlReader.Create(stringReader);
            Grid g1 = (Grid)System.Windows.Markup.XamlReader.Load(xmlReader);

    将转化得到grid(g1),赋给原控件,然后再次add这个child。

    最后,就可以看到应用程序“记忆”了上一次的配置。

    但这样做,我仍有几个疑问:

    1. 能不能在 应用程序加载MainWindow.xmal.cs之前,就把上一次存在xml文件的grid控件读出来,并显示。这样或许会增加程序执行的效率。

    2.有没有办法,把窗口的主要属性和包含的控件,一起存储起来,并显示。(我用类似上述的办法试过,报错“未能注册命名对象。不能在此范围中注册重复的名称“grid1”。”,行号为“1”,行位置为“230”)

    期待您的解答,以及您的例程!

     

     


    Best Regards! C.Lu
    2011年2月21日 9:03
  • 你好 C.Lu,

    我将标记我的回复为这个帖子的答案。

    关于你在完成过程中的Error:

    -->       未能注册命名对象。不能在此范围中注册重复的名称“grid1”。”,行号为“1”,行位置为“230”)

    我需要更多的信息才能告诉你原因,这样直接看错误是很难找到引起这个错误的原因的。

    关于那个例子,我需要时间。

     

    Best regards,


    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年2月23日 10:34
    版主
  • 我目前虽然初步完成了项目中这方面的功能,但没有使用XML保存控件。

    因为,我发现如果利用System.Windows.Markup.XamlWriter.Save()保存一个控件,控件中的许多信息,比如响应函数等,都会丢失。这样的话,下次打开应用程序的时候,只能得到一个外表看似一样的窗口,但里面的操作就完全没有了。

    所以我把一些主要的属性保存下来,下次打开应用程序的时候,进行重画,这样做虽然可以达成目标,但不能解释我对上面出现问题的疑惑。


    Best Regards! C.Lu
    2011年2月24日 4:01