3つの異なるウィンドウを使用してC#でWPFアプリケーションを作成しましたHome.xaml, Name.xaml, Config.xam
。Home.xaml.cs
他の両方の形式で使用できる変数を宣言したいと思います。やってみpublic string wt = "";
ましたがうまくいきませんでした。
3つのフォームすべてで使用できるようにするにはどうすればよいですか?
3つの異なるウィンドウを使用してC#でWPFアプリケーションを作成しましたHome.xaml, Name.xaml, Config.xam
。Home.xaml.cs
他の両方の形式で使用できる変数を宣言したいと思います。やってみpublic string wt = "";
ましたがうまくいきませんでした。
3つのフォームすべてで使用できるようにするにはどうすればよいですか?
特にXBAPPに移行したい場合の適切な方法は、XBAPPをに保存することです。
Application.Current.Properties
これはDictionaryオブジェクトです。
ウィンドウとユーザーコントロールの間で値をやり取りしたり、静的クラスを作成して WPF 内の既存の機能を複製したりする必要がないようにするには、次を使用できます。
App.Current.Properties["NameOfProperty"] = 5;
string myProperty = App.Current.Properties["NameOfProperty"];
これは前述しましたが、構文が少しずれていました。
これにより、アプリケーション内で実行されている任意のコードからアクセスできるグローバル変数がアプリケーション内に提供されます。
静的プロパティを使用できます。
public static class ConfigClass()
{
public static int MyProperty { get; set; }
}
編集:
ここでの考え方は、すべての「共通データ」(通常は構成)を保持するクラスを作成することです。もちろん、どのクラスでも使用できますが、静的クラスを使用することをお勧めします。このプロパティには、次のようにアクセスできます。
Console.Write(ConfigClass.MyProperty)
他の人が前に述べたようにApp.Current.Properties
、静的クラスを使用または作成します。ここでは、静的クラスについてさらにガイダンスが必要な人に例を提供します。
ソリューション エクスプローラーでプロジェクト名を右クリックし、名前を付け
Add > New Item
ますClass
(通常は GLOBALS という名前を付けます) 。
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; }
}
}
using ProjectName
GLOBALS.Variable1 = "MyName"
Console.Write(GLOBALS.Variable1)
GLOBALS.Variable2 = 100;
GLOBALS.Variable2 += 20;
GLOBALS.Variable3 = new MyObject();
GLOBALS.Variable3.MyFunction();
単体テストと静的クラス/静的変数に関する注意事項
一般に、静的クラスを使用してグローバル変数を保持することは悪い習慣と見なされています。主な理由の 1 つは、コードを適切に単体テストする機能を大幅に妨げる可能性があることです。
ただし、テスト可能なコードが必要であり、それでも静的グローバル変数クラスを使用したい場合は、少なくとも 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 プロパティに設定したりできます。これは、単体テストを実行する前に一般的に行われるため、テスト固有の設定を確実に行うことができます。
ここでできることは2つあります(とりわけ、最初に頭に浮かぶのは2つだけです)。
Home.xaml.csで変数を静的にすることができます
public static string Foo = "";
変数を3つのフォームすべてに渡すことができます。
私は#2を自分で使用し、必要に応じて、必要なデータを含む別のクラスを作成します。次に、各クラスがデータにアクセスできるようになります。
アプリ.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()