如何在C#Silverlight App中将字符串值从一个区域访问到另一个区域

时间:2009-09-01 20:55:31

标签: c# silverlight xaml

更新:使userIP静态似乎工作。但是,我了解到MainPage()正在Application_Startup()之前进行,因此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"];
        }
...}

我添加到代码中的唯一行是public string userIP;this.userIP = e.InitParams["txtUserIP"];。我想知道这是否是正确的方法,以便以后提供这些数据。

在我的MainPage.xaml.cs文件中,我正在尝试引用我之前指定的userIP值,但我无法弄清楚如何执行此操作。例如,我想创建一个新字符串,然后将其设置为等于userIP:

public MainPage()
{
    InitializeComponent();
    string myUserIP;
    myUserIP = VideoDemo2.App.userIP;
}

然后我收到一条错误消息:错误1非静态字段,方法或属性'VideoDemo2.App.userIP'需要对象引用。

我必须对App.xaml.cs中的InitParams做一些事情,因为这是传递参数的地方,但我想让其中一个参数可用于我的应用程序的其他部分,而不是将其放入XAML,如果可能的话。需要发生什么才能让我可以在应用程序中“看到”该值?我是C#的新手,所以任何帮助都会非常感激。

3 个答案:

答案 0 :(得分:1)

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

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

<param name="initParams" value="txtSomeVariable=SomeValue"/>

然后在App.xaml.cs的Application_Startup方法中,使用foreach循环将值添加到资源字典中:

    private void Application_Startup(object sender, StartupEventArgs e)
    {
        //Method 1 - Resource Dictionary
        if (e.InitParams != null)
        {
            foreach (var item in e.InitParams)
            {
                this.Resources.Add(item.Key, item.Value);
            }
        }
        this.RootVisual = new MainPage();
    }

要在应用程序的生命周期中从字典中提取值,只需使用:

App.Current.Resources["txtSomeVariable"].ToString();

我在Silverlight.Net的Tim Heuer视频演示中了解了InitParams和应用资源词典:Using Startup Parameters with Silverlight

另外,我写了一篇博文,更详细地描述了这种情况:Pass the IP Address of a User to Silverlight as a Parameter

我希望这些信息有助于其他用户偶然发现这个问题!

答案 1 :(得分:0)

问题是VideoDemo2.App不是实例,而是一种类型。

如果您想访问userIP,则需要访问应用的实际实例。

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

App runningApp = (VideoDemo2.App)Application.Current;
string myUserIP = runningApp.userIP;

或者,您可以在App中将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"];
        }
...}

答案 2 :(得分:-1)

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

((VideoDemo2.App)Application.Current).userIP;
编辑:顺便说一下,我宁愿在单例类中保留这样的设置(它是一个在C#中实现的简单模式,快速搜索应该足够了)。此外,对于“良好形式”,任何公共应该是财产和公共财产应该是pascal套。将公共字符串userIp更改为:

public string UserIP { get; set; }

你很快就能赢得朋友并影响人们;)

编辑:这是关于Silverlight http://msdn.microsoft.com/en-us/library/system.windows.application%28VS.95%29.aspx中的Application类生命周期的一个很好的阅读