【问题标题】:Accessing a list picker inside a PanoramaHeader Template访问 PanoramaHeader 模板内的列表选择器
【发布时间】:2012-07-14 13:56:29
【问题描述】:

我有一个全景控件,我在其中创建了一个标题模板以在其中添加一个列表选择器。 (就像人民中心选择社交帐户一样)

<DataTemplate x:Key="PanoramaItemHeaderTemplate">
     <ContentPresenter>
          <StackPanel Height="129">
               <TextBlock Text="{Binding}" FontSize="72" Margin="0,7,0,0" />
               <toolkit:ListPicker x:Name="listPick" Margin="0,-21,0,0" BorderThickness="0">
                     <toolkit:ListPickerItem Content="twitter"></toolkit:ListPickerItem>
               </toolkit:ListPicker>                    
          </StackPanel>
     </ContentPresenter>
</DataTemplate>

全景控件位于 MainPage.xaml 文件中,我希望从后面的代码中访问 listpicker,以便能够填充它并处理它的选择事件。

我不知道该怎么做。我尝试将 x:name 属性添加到列表选择器中,但我无法在后面的 MainPage 代码中访问它。

非常欢迎任何关于如何解决此问题的想法,谢谢!

【问题讨论】:

    标签: c# windows-phone-7 silverlight-toolkit panorama-control listpicker


    【解决方案1】:

    从你现在的情况来看,做你想做的最快的方法是遍历可视化树

    查看这里的实现:

    How to access a specific item in a Listbox with DataTemplate?

    【讨论】:

    • 我尝试了解决您提到的问题的辅助功能。但是什么也没发生,我得到了空值。我尝试将 x:name 添加到全景项目,然后调用 ListPicker listPicker1 = FindDecendant(myPanoramaItem) 但返回 null。有什么想法吗?
    • 这很奇怪。您要么尝试在添加项目和创建可视化树之前进行搜索,要么列表选择器不存在。您是否尝试过搜索整个页面对象(而不仅仅是全景项目)?您可以尝试将以下行添加为 FindDescendant 方法的第一行:Debug.WriteLine(obj.ToString());这样您就可以查看树中的确切内容并查看您的全景项目是否添加正确?
    • 我如何知道可视化树是否已经创建?在调用 InitializeComponent() 方法后,我正在 MainPage 构造函数中尝试此操作。我添加了 WriteLine(obj.ToString()) 但它只打印全景项目,仅此而已
    • 谢谢,你说的对。尚未创建的 PanoramaItems。我为 PanoramaControl 的加载事件使用了一个处理程序,在那里我使用了 FindDescendant 方法并且工作正常!
    【解决方案2】:

    您不能通过 x:Name 访问 ListPicker,因为它不是明确的:为您的全景图中的每个 PanoramaItem 生成一个 ListPicker。所以第一个问题是,这真的是你想做的吗?如果是这样,您需要使用绑定 (ItemSource) 填充它

    【讨论】:

    • 是的,我明白这一点。我想在 each 全景项目的标题内有一个不同的列表选择器。我想在后面的代码中填充它,因为如果我想使用全屏模式,listpicker 错误会阻止我使用 xaml listpickeritem。但我仍然不明白如何从后面的代码中访问 listpicker 的每个实例以填充它并添加事件处理程序......
    【解决方案3】:

    您可以访问另一个资源中的元素,请考虑以下示例:

    <Grid Name="myGrid">
    <StackPanel x:Name="stack1">
    <TextBlock x:Name="abc"/>
    </StackPanel>
    </Grid>
    

    默认情况下,我们只能在代码中访问Grid myGrid。要获得对StackPanel 的引用,我们可以这样做:

    StackPanel myStack=myGrid.FindName("stack1") as Stackpanel;
    

    之后我们可以参考TextBlock:

    TextBlock myTextBlock=myStack.FindName("abc") as TextBlock;
    

    之后您可以根据需要修改 myTextBlock。您可以在您的案例中应用相同的技术,它会起作用。 希望对您有所帮助:)。

    【讨论】:

    • 我尝试为模板和全景项中的每个元素添加一个名称,但什么也没发生,我得到了 null。我只能访问全景项目,从那里我尝试为每个元素查找名称,但总是返回 null。有什么想法吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-11-08
    • 1970-01-01
    • 1970-01-01
    • 2011-05-03
    • 1970-01-01
    • 1970-01-01
    • 2015-05-11
    相关资源
    最近更新 更多