Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/279.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在C#Silverlight应用程序中使字符串值从一个区域访问到另一个区域_C#_Silverlight_Xaml - Fatal编程技术网

如何在C#Silverlight应用程序中使字符串值从一个区域访问到另一个区域

如何在C#Silverlight应用程序中使字符串值从一个区域访问到另一个区域,c#,silverlight,xaml,C#,Silverlight,Xaml,更新:使userIP保持静态似乎是可行的。但是,我了解到MainPage()是在应用程序启动()之前执行的,因此InitParam值不是立即可用的。我可能得把代码放在别的地方 我正在编写一个Silverlight应用程序,并在InitParams中引入一个变量,我希望该变量能够以某种方式访问代码的其他区域。我不希望立即将值赋给XAML中的元素,而是尽可能使用C。在使用数据修改XAML之前,我必须执行另一个步骤。以下是我到目前为止所做的: 在我的App.xaml.cs文件中,我向App类添加了一个

更新:使userIP保持静态似乎是可行的。但是,我了解到MainPage()是在应用程序启动()之前执行的,因此InitParam值不是立即可用的。我可能得把代码放在别的地方

我正在编写一个Silverlight应用程序,并在InitParams中引入一个变量,我希望该变量能够以某种方式访问代码的其他区域。我不希望立即将值赋给XAML中的元素,而是尽可能使用C。在使用数据修改XAML之前,我必须执行另一个步骤。以下是我到目前为止所做的:

在我的App.xaml.cs文件中,我向App类添加了一个字符串userIP,希望以后能够访问这个值。然后,我尝试将InitParams变量的值分配给我在上面创建的userIP字符串。这是它的样子

namespace VideoDemo2
{
    public partial class App : Application
    {
        public string userIP;
        public App()
        {
            this.Startup += this.Application_Startup;
            this.Exit += this.Application_Exit;
            this.UnhandledException += this.Application_UnhandledException;

            InitializeComponent();
        }

        private void Application_Startup(object sender, StartupEventArgs e)
        {
            this.RootVisual = new MainPage();
            this.userIP = e.InitParams["txtUserIP"];
        }
...}
我添加到代码中的唯一行是
publicstringuserip
this.userIP=e.InitParams[“txtoserip”]。我想知道这是不是一个正确的方法,让这些数据在以后可用

在MainPage.xaml.cs文件中,我试图引用我先前指定的userIP值,但我不知道如何进行引用。例如,我想创建一个新字符串,然后将其设置为等于userIP:

public MainPage()
{
    InitializeComponent();
    string myUserIP;
    myUserIP = VideoDemo2.App.userIP;
}
然后我得到一个错误:错误1非静态字段、方法或属性“VideoDemo2.App.userIP”需要对象引用


我必须处理App.xaml.cs中的
InitParams
,因为参数就是在这里传递的,但是如果可能的话,我想让这些参数中的一个可以用于我的应用程序的其他部分,而不必将其放入xaml中。需要做什么才能在应用程序中“看到”值?我是C#的新手,因此非常感谢您的帮助。

问题在于VideoDemo2.App不是一个实例,而是一种类型

如果你想访问userIP,你需要访问你的应用程序的实际实例

Silverlight提供了一个公开当前应用程序实例的静态属性:

App runningApp = (VideoDemo2.App)Application.Current;
string myUserIP = runningApp.userIP;
或者,您可以在应用程序中将userIP设置为静态字符串。您可以在设置“this”的位置删除它,但您可以从任何地方访问该类型

namespace VideoDemo2
{
    public partial class App : Application
    {
        public static string userIP;
        public App()
        {
            this.Startup += this.Application_Startup;
            this.Exit += this.Application_Exit;
            this.UnhandledException += this.Application_UnhandledException;

            InitializeComponent();
        }

        private void Application_Startup(object sender, StartupEventArgs e)
        {
            this.RootVisual = new MainPage();
            App.userIP = e.InitParams["txtUserIP"];
        }
...}

问题在于VideoDemo2.App不是一个实例,而是一个类型

如果你想访问userIP,你需要访问你的应用程序的实际实例

Silverlight提供了一个公开当前应用程序实例的静态属性:

App runningApp = (VideoDemo2.App)Application.Current;
string myUserIP = runningApp.userIP;
或者,您可以在应用程序中将userIP设置为静态字符串。您可以在设置“this”的位置删除它,但您可以从任何地方访问该类型

namespace VideoDemo2
{
    public partial class App : Application
    {
        public static string userIP;
        public App()
        {
            this.Startup += this.Application_Startup;
            this.Exit += this.Application_Exit;
            this.UnhandledException += this.Application_UnhandledException;

            InitializeComponent();
        }

        private void Application_Startup(object sender, StartupEventArgs e)
        {
            this.RootVisual = new MainPage();
            App.userIP = e.InitParams["txtUserIP"];
        }
...}

您可以在静态属性Application.Current中找到App类的实例。从SL应用程序中的任何位置尝试此操作:

((VideoDemo2.App)Application.Current).userIP;
编辑:顺便说一句,我更喜欢在单例类中保留这样的设置(这是一种在C#中实现的简单模式,快速搜索应该足够了)。对于“良好形式”,任何公共的东西都应该是属性,公共属性应该是pascal大小写。将公共字符串userIp更改为:

public string UserIP { get; set; }
你会很快赢得朋友并影响他人;)


编辑:这是一本关于Silverlight中应用程序类生命周期的好书

您可以在静态属性Application.Current中找到应用程序类的实例。从SL应用程序中的任何位置尝试此操作:

((VideoDemo2.App)Application.Current).userIP;
编辑:顺便说一句,我更喜欢在单例类中保留这样的设置(这是一种在C#中实现的简单模式,快速搜索应该足够了)。对于“良好形式”,任何公共的东西都应该是属性,公共属性应该是pascal大小写。将公共字符串userIp更改为:

public string UserIP { get; set; }
你会很快赢得朋友并影响他人;)


编辑:这是一本关于Silverlight中应用程序类生命周期的好书

FlySwat和James Cadd的回答都很有帮助,但我发现在Silverlight中,使用应用程序的资源字典效果最好

在ASPX或HTML页面中,在Silverlight
标记中使用以下
标记:

<param name="initParams" value="txtSomeVariable=SomeValue"/>
要在应用程序的生命周期内从字典中提取值,只需使用:

App.Current.Resources["txtSomeVariable"].ToString();
我从Tim Heuer在Silverlight.Net上的视频演示中了解了InitParams和应用程序资源字典:

此外,我还写了一篇博客文章,更详细地描述了这种情况:


我希望这些信息能帮助其他偶然发现这个问题的用户

FlySwat和James Cadd的回答都很有帮助,但我发现在Silverlight中,使用应用程序的资源字典效果最好

在ASPX或HTML页面中,在Silverlight
标记中使用以下
标记:

<param name="initParams" value="txtSomeVariable=SomeValue"/>
要在应用程序的生命周期内从字典中提取值,只需使用:

App.Current.Resources["txtSomeVariable"].ToString();
我从Tim Heuer在Silverlight.Net上的视频演示中了解了InitParams和应用程序资源字典:

此外,我还写了一篇博客文章,更详细地描述了这种情况:


我希望这些信息能帮助其他偶然发现这个问题的用户

不要这样做-将为您创建一个应用程序实例,并在整个应用程序生命周期中保留该实例。查看Application.Current静态属性。我不是说他需要实例化一个应用程序,我是说他需要使用提供的实例。但这是你在回答App runningApp=new App()时显示的。您不需要在Silverlight中构造应用程序类的实例,这已经为您完成了。他的问题实际上与Silverlight无关,这是类型和实例概念之间的一个普遍误解。我是在引导他解决更大的问题,而不是把重点放在具体的执行上。不管怎样,我已经说明了如何使用提供的silverlight静态类