21

我在 c# 中创建了一个带有 3 个不同窗口的 WPF 应用程序,Home.xaml, Name.xaml, Config.xaml。我想声明一个变量Home.xaml.cs,我可以在其他两种形式中使用它。我试过做public string wt = "";,但没有奏效。

我怎样才能使它对所有三种形式都可用?

4

6 回答 6

29

正确的方法,尤其是如果您想迁移到 XBAPP,将其存储在

Application.Current.Properties

这是一个字典对象。

于 2009-07-21T20:26:34.147 回答
27

为了避免在窗口和用户控件之间传递值,或者创建一个静态类来复制 WPF 中的现有功能,您可以使用:

  • 环境:App.Current.Properties["NameOfProperty"] = 5;
  • 得到:string myProperty = App.Current.Properties["NameOfProperty"];

上面提到了这一点,但语法有点偏离。

这在您的应用程序中提供了全局变量,可以从其中运行的任何代码访问。

于 2011-04-05T11:31:35.110 回答
17

您可以使用静态属性:

public static class ConfigClass()
{
    public static int MyProperty { get; set; }
}

编辑:

这里的想法是创建一个包含所有“公共数据”的类,通常是配置。当然,您可以使用任何类,但建议您使用静态类。您可以像这样访问此属性:

Console.Write(ConfigClass.MyProperty)
于 2009-07-21T20:05:48.963 回答
4

正如其他人在使用App.Current.Properties或创建静态类之前提到的那样。我在这里为那些需要更多静态类指导的人提供一个示例。

  1. 添加一个新的类

在解决方案资源管理器中右键单击您的项目名称,Add > New Item选择Class为其命名(我通常将其命名为 GLOBALS)

  1. 该cs文件应该是什么样子
using System;

namespace ProjectName
{
    public static class GLOBALS
    {
        public static string Variable1 { get; set; }
        public static int Variable2 { get; set; }
        public static MyObject Variable3 { get; set; }
    }
}
  1. 将引用添加到您打算使用这些变量的 .cs 文件中

using ProjectName

  1. 我们完成了。用它。例子:
GLOBALS.Variable1 = "MyName"
Console.Write(GLOBALS.Variable1)
GLOBALS.Variable2 = 100;
GLOBALS.Variable2 += 20;
GLOBALS.Variable3 = new MyObject();
GLOBALS.Variable3.MyFunction();

关于单元测试和静态类/静态变量的说明

使用静态类来保存全局变量通常被认为是不好的做法,主要原因之一是它会严重阻碍正确单元测试代码的能力。

但是,如果您需要可测试的代码并且您仍然想使用静态全局变量类,那么至少考虑使用单例模式来访问您的 GLOBALS。[更多详情:https://jonskeet.uk/csharp/singleton.html]

下面是我的意思的一个有用的片段。使 GLOBALS 抽象并删除静态,然后在 GLOBALS 类中添加以下内容:

    private static GLOBALS instance = null;
    
    /// <summary>
    /// The configuration instance used by the application and unit tests
    /// </summary>
    public static GLOBALS Instance
    {
        get
        {
            if (instance == null)
            {
                //Create the default configuration provider
                instance = new AppConfigConfiguration();
            }

            return instance;
        }
        set
        {
            instance = value;
        }
    }

AppConfigConfiguration(在上面的示例中)是派生自 GLOBALS 的特定于应用程序的设置类。单例模式还允许派生其他配置,并且可以选择在 Instance 属性上设置,这是在单元测试运行之前常见的情况,因此可以确保测试特定的设置。

于 2020-04-16T04:36:30.907 回答
1

应用程序.xaml:

<Application x:Class="WpfTutorialSamples.App"
         xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
         xmlns:sys="clr-namespace:System;assembly=mscorlib"
         StartupUri="WPF application/ResourcesFromCodeBehindSample.xaml">
<Application.Resources>
    <sys:String x:Key="strApp">Hello, Application world!</sys:String>
</Application.Resources>

代码隐藏:

Application.Current.FindResource("strApp").ToString()
于 2014-12-22T00:08:31.923 回答
1

您可以在这里做两件不同的事情(除其他外;这只是首先想到的两件)。

  1. 您可以在 Home.xaml.cs 上将变量设为静态

    public static string Foo = "";
    
  2. 您可以将变量传递给所有三种形式。

我自己会选择#2,如有必要,我会创建一个包含我需要的数据的单独类。然后每个类都可以访问数据。

于 2009-07-21T20:09:02.623 回答