您在哪里将全局变量放在WPF应用程序中?

时间:2009-11-23 15:18:19

标签: c# wpf global-variables

PHP 网络编程中,我总是制作一个单件输出对象,我可以在其中输入必须可用的全局信息代码行。

因此,在 WPF 应用程序中,我创建了以下类来执行相同的功能,例如变量 ReturnToPageIdCode 会在处理完某个任务后返回另一个页面应该返回的页面,我可以在任何地方设置并获取该值。

这很好用。

但是,我不禁认为在有状态 WPF环境中,我使用此单例输出对象重新创建方向盘

您在哪里放置应用程序范围的值在WPF应用程序中?有没有一些标准的地方可以做到这一点?

public class Output
{
    private Output output;

    private static Output instance;

    public string ReturnToPageIdCode { get; set; }

    public static Output GetInstance()
    {
        if (instance == null)
        {
            instance = new Output();
        }
        return instance;
    }

    public string GetTestMessage()
    {
        return "This is a global test message from the output singleton.";
    }
}

5 个答案:

答案 0 :(得分:10)

全局?拒绝吧。 (对不起,有人不得不说)配置内容,正如其他人建议的那样,使用App.Config,你提供的代码对我来说就像M-V-VM - 你应该检查一下。 WPF,就其本质而言,促进了这一点。学习它,爱它,活它。

答案 1 :(得分:4)

我认为我认为你正在描述的那种全局状态是配置信息。结果,我将它放在App.config文件中,通常是通过项目的属性“设置”选项卡。

这将通过<WhateverNamespace>.Properties.Settings公开您的配置信息,以便以类型安全的方式轻松访问。

如果您正在描述其他内容,例如不是配置信息的可变应用程序状态,我强烈建议将您的范例转换为更客户端应用程序形式,因为它的错误导致这种全局状态非常不受欢迎 - 性质。 IE,重构您的应用程序模型,使其不依赖于全局数据 - 改为使用参数和对象。

答案 2 :(得分:3)

App.Config(双击项目中的Properties节点)获取用户特定(读/写)和特定于应用程序(只读)的基元。

对于诸如提供者(数据库,日志记录等)之类的复杂类型,没有“一个”的地方。但今天最好的模式是使用某种形式的dependency injection,例如UnityNInject

答案 3 :(得分:1)

虽然我普遍缺乏对全局变量的热情,但至少应该承认全球信息的中央WPF机制:应用程序的资源字典。有很多事情你不应该使用它(比如,你可以通过在应用程序的资源字典中放入一个XML数据源来创建一个类似单一的对象,但实际上,不要这样做),但是有很多东西您应该做的事情 - 全局样式,全局模板等

答案 4 :(得分:1)

试试这个

  /// <summary>
    /// "Global variables" or kind of "Session State" class.
    /// To save a variable: ApplicationState.SetValue("currentCustomerName", "Jim Smith");
    /// To read a variable: MainText.Text = ApplicationState.GetValue<string>("currentCustomerName");
    /// </summary>
    public static class ApplicationData
    {
        /// <summary>
        /// Get an application-scope resource Formatted News
        /// </summary>
        /// <returns></returns>
        public static DataContainerModel GetNews()
        {
            var  formattedNews = (DataContainerModel)Application.Current.Resources["FormattedNews"];
            return formattedNews;
        }

        /// <summary>
        /// Set an application-scope resource Formatted News
        /// </summary>
        /// <param name="dataContainerModel"></param>
        public static void SetNews(DataContainerModel dataContainerModel)
        {
            Application.Current.Resources["FormattedNews"] = dataContainerModel;
        }

        private static ConcurrentDictionary<string, object> _values = new ConcurrentDictionary<string, object>();

        public static void SetValue(string key, object value)
        {
            if (_values.ContainsKey(key))
            {
                var oldValue = new object();
                _values.TryRemove(key, out oldValue);
            }
            _values.TryAdd(key, value);
        }

        public static T GetValue<T>(string key)
        {
            if (_values.ContainsKey(key))
            {
                return (T)_values[key];
            }
            else
            {
                return default(T);
            }
        }

    }

所以在这里你会看到两种方法。我想同时拥有它们。

哦! DataContainerModel将成为您需要的任何自定义类。