Silverlight 如何通过编程访问手风琴的手风琴项目?
我在silverlight应用程序中使用手风琴。在手风琴项目中,我有一个列表框,我需要访问扩展的手风琴项目和手风琴的这个列表框 我很难找到访问accordionitem及其所包含的列表框的方法。我该怎么做 我试图解决的是使用以下扩展类:Silverlight 如何通过编程访问手风琴的手风琴项目?,silverlight,silverlight-toolkit,Silverlight,Silverlight Toolkit,我在silverlight应用程序中使用手风琴。在手风琴项目中,我有一个列表框,我需要访问扩展的手风琴项目和手风琴的这个列表框 我很难找到访问accordionitem及其所包含的列表框的方法。我该怎么做 我试图解决的是使用以下扩展类: public static IEnumerable<DependencyObject> GetVisuals(this DependencyObject root) { int count = VisualTreeHelper.GetChildr
public static IEnumerable<DependencyObject> GetVisuals(this DependencyObject root)
{
int count = VisualTreeHelper.GetChildrenCount(root);
for (int i = 0; i < count; i++)
{
var child = VisualTreeHelper.GetChild(root, i);
yield return child;
foreach (var descendants in child.GetVisuals())
{
yield return descendants;
}
}
}
在AccordionItem中,我使用DataTemplate来呈现数据。在DataTemplate中,我有两个列表框。我需要访问选定的accordionitem中的数据模板,以及datatemplate中的两个列表框 试试这个:
<UserControl x:Class="SilverlightApplication10.MainPage"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:layout="clr-namespace:System.Windows.Controls;assembly=System.Windows.Controls.Layout.Toolkit"
mc:Ignorable="d"
d:DesignHeight="300"
d:DesignWidth="400">
<Grid x:Name="LayoutRoot"
Background="White">
<layout:Accordion x:Name="Accordion1">
<layout:Accordion.Items>
<layout:AccordionItem Header="Header 1">
<ListBox>
<ListBox.Items>
<ListBoxItem Content="Item 1"></ListBoxItem>
<ListBoxItem Content="Item 2"></ListBoxItem>
<ListBoxItem Content="Item 3"></ListBoxItem>
</ListBox.Items>
</ListBox>
</layout:AccordionItem>
<layout:AccordionItem Header="Header 2">
<ListBox>
<ListBox.Items>
<ListBoxItem Content="Item 1"></ListBoxItem>
<ListBoxItem Content="Item 2"></ListBoxItem>
<ListBoxItem Content="Item 3"></ListBoxItem>
</ListBox.Items>
</ListBox>
</layout:AccordionItem>
</layout:Accordion.Items>
</layout:Accordion>
</Grid>
</UserControl>
谢谢你的回答。就我而言,这有点困难。我使用容器样式来设置accordionitem的样式,它有一个控件。当我试图将项强制转换到该控件时,出于某种原因,它返回null。我可能需要重新表述我的问题,因为它不能很好地解释我的问题。很抱歉:)没问题,只需发布更多代码,我会看看是否能提供帮助。我更新了我的问题,并提供了更多详细信息。在我的手风琴项目中,我不是直接放置listbox控件,而是在DataTemplate中定义它们。我的问题是访问数据模板及其内容-我的列表框!好吧,我想我明白你的意思了。问题是,您到底想对列表框做什么?例如,如果要检查这些列表框中选择的内容,可能有更好的方法,例如将列表框的SelectedItem绑定到数据对象上的属性。然后您可以在数据对象上检查该属性。如果你能添加一些关于你正在努力实现的目标的信息,那么就更容易为你指明正确的方向。
int selectedIndex = OrganiChartAccordion.SelectedIndex;
AccordionItem accordionItem = OrganiChartAccordion.ItemContainerGenerator.ContainerFromIndex(selectedIndex) as AccordionItem;
<UserControl x:Class="SilverlightApplication10.MainPage"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:layout="clr-namespace:System.Windows.Controls;assembly=System.Windows.Controls.Layout.Toolkit"
mc:Ignorable="d"
d:DesignHeight="300"
d:DesignWidth="400">
<Grid x:Name="LayoutRoot"
Background="White">
<layout:Accordion x:Name="Accordion1">
<layout:Accordion.Items>
<layout:AccordionItem Header="Header 1">
<ListBox>
<ListBox.Items>
<ListBoxItem Content="Item 1"></ListBoxItem>
<ListBoxItem Content="Item 2"></ListBoxItem>
<ListBoxItem Content="Item 3"></ListBoxItem>
</ListBox.Items>
</ListBox>
</layout:AccordionItem>
<layout:AccordionItem Header="Header 2">
<ListBox>
<ListBox.Items>
<ListBoxItem Content="Item 1"></ListBoxItem>
<ListBoxItem Content="Item 2"></ListBoxItem>
<ListBoxItem Content="Item 3"></ListBoxItem>
</ListBox.Items>
</ListBox>
</layout:AccordionItem>
</layout:Accordion.Items>
</layout:Accordion>
</Grid>
</UserControl>
using System;
using System.Diagnostics;
using System.Linq;
using System.Windows;
using System.Windows.Controls;
namespace SilverlightApplication10
{
public partial class MainPage : UserControl
{
public MainPage()
{
InitializeComponent();
this.Loaded += MainPage_Loaded;
}
void MainPage_Loaded(object sender, RoutedEventArgs e)
{
Accordion1.Items.ToList().ForEach(item =>
{
((item as AccordionItem).Content as ListBox).Items.ToList().ForEach(listBoxItem =>
{
var content = ((ListBoxItem)listBoxItem).Content;
Debug.WriteLine(content);
});
});
}
}
}