none
页面资源调用问题 RRS feed

  • 问题

  • 先来段代码
        <Page.Resources>
            <StackPanel x:Key="InfoPanel" Orientation="Vertical">
                <StackPanel Orientation="Horizontal">
                    <Label x:Name="label_地形名称1">地形名称:</Label>
                    <Label x:Name="label_地形名称2"></Label>
                </StackPanel>
                <StackPanel>
                    <Label x:Name="label_类型1">类型:</Label>
                    <Label x:Name="label_类型2"></Label>
                </StackPanel>
            </StackPanel>
        </Page.Resources>
    我在后台页面中可以调用InfoPanel,但是怎么能得到label?

    项目比较仓促,没时间具体学习,希望大家能帮下忙...
    3Q ~~~~
    有人说,充满技术的生活枯燥无味.. 我笑他们不懂.因为只有技术才能充实生活.. 学习就像生活,都需要善于总结,才能发现问题,取得进步.. 生活中充满了数学算式与结构,只要我们善于观察和思考..
    2009年9月27日 3:24

答案

  • 楼主你好,
    -->我在后台页面中可以调用InfoPanel,但是怎么能得到label?
    在你的代码中,你在Page.Resources中定义了一个StackPanel作为资源,这里有两种情况要分开讨论。
    1)你只定义了,但是没有应用到App中的VisualTree中去,也就是说上面的StackPanel还没有注册到VisualTree中的某一Name Scope中去,这样的话,你不能用FindName方法得到其子元素(如Label),但是你可以用Children属性间接得到:

    Code segment:
      StackPanel panel = this.Resources["InfoPanel"] as StackPanel;

     Label label2 = (panel.Children[0] as StackPanel).Children[0] as Label ;


    2)如果你应用了定义的资源,比如你用一个Label:
     <Label Content="{StaticResource InfoPanel}" />
    现在上面的资源已加入了当前的VisualTree(在XAML中定义的元素自动被注册到了当前根元素,也就是Page的Name scope,不需要手动调用RegisterName方法),现在我们可以调用FindName方法得到Label了:

       Label label1 = panel.FindName("myLabel") as Label;


    如有其他疑问,请继续回贴。

    谢谢。
    Jim Zhou -MSFT
    2009年9月27日 9:49
    版主

全部回复

  • 楼主你好,
    -->我在后台页面中可以调用InfoPanel,但是怎么能得到label?
    在你的代码中,你在Page.Resources中定义了一个StackPanel作为资源,这里有两种情况要分开讨论。
    1)你只定义了,但是没有应用到App中的VisualTree中去,也就是说上面的StackPanel还没有注册到VisualTree中的某一Name Scope中去,这样的话,你不能用FindName方法得到其子元素(如Label),但是你可以用Children属性间接得到:

    Code segment:
      StackPanel panel = this.Resources["InfoPanel"] as StackPanel;

     Label label2 = (panel.Children[0] as StackPanel).Children[0] as Label ;


    2)如果你应用了定义的资源,比如你用一个Label:
     <Label Content="{StaticResource InfoPanel}" />
    现在上面的资源已加入了当前的VisualTree(在XAML中定义的元素自动被注册到了当前根元素,也就是Page的Name scope,不需要手动调用RegisterName方法),现在我们可以调用FindName方法得到Label了:

       Label label1 = panel.FindName("myLabel") as Label;


    如有其他疑问,请继续回贴。

    谢谢。
    Jim Zhou -MSFT
    2009年9月27日 9:49
    版主
  • 楼主,
    我觉得上面的回复可以解决你的问题了,如有疑问,请继续回复。
    谢谢。


    Jim Zhou -MSFT
    2009年9月28日 8:59
    版主
  • 第二点还不是很清楚,我是刚刚接触这个,还不太明白..
    <
    Label Content="{StaticResource InfoPanel}" />
    这个标签是不是还应该加上name="myLabel"或x:Name="myLabel"

    有人说,充满技术的生活枯燥无味.. 我笑他们不懂.因为只有技术才能充实生活.. 学习就像生活,都需要善于总结,才能发现问题,取得进步.. 生活中充满了数学算式与结构,只要我们善于观察和思考..
    2009年9月28日 9:01
  • 楼主,
    -->这个标签是不是还应该加上name="myLabel"或x:Name="myLabel"
    在WPF中,你可以给XAML通能过Name也可以通过x:Name命名, 这个名字可以方便以后你查打这个元素,当然不用名字也可以找得到, 也就是说你可以加Name,也可以不加Name.
    至于Name和x:Name语法的异同,你可以参考MSDN文档:
    http://msdn.microsoft.com/en-us/library/ms752290.aspx

    如还有疑问,请继续回复.
    谢谢.
    Jim Zhou -MSFT
    2009年9月29日 8:08
    版主