从Silverlight中的LayoutRoot中查找控件

时间:2011-02-22 09:47:27

标签: silverlight

我的usercontrol上有多个文本块Layoutroot问题是如何通过名称找到特定的TextBlock?

感谢名单

3 个答案:

答案 0 :(得分:7)

var myElement =
    ((FrameworkElement)System.Windows.Application.Current.RootVisual)
        .FindName("TextBlockName");
如果文本块已经被渲染,

应该适用于这种情况。

为了能够像@ColinE提到的那样更容易地遍历可视树,您还可以使用Silverlight工具包。

// requires System.Windows.Controls.Toolkit.dll
using System.Windows.Controls.Primitives;

var myElement = myRoot.GetVisualDescendants().OfType<TextBlock>()
    .Where(txb => txb.Name == "TextBlockName").FirstOrDefault();

答案 1 :(得分:3)

如果您要创建UserControl,那么您通过x:Name命名的任何元素都可以作为代码隐藏中的字段使用。

如果您没有创建UserControl,可以通过Linq to VisualTree搜索可视树...

TextBlock block = LayoutRoot.Descendants<TextBlock>()
                            .Cast<TextBlock>()
                            .SingleOrDefault(t => t.Name == "TextBlockName");

答案 2 :(得分:1)

嘿,Masn我在我的案例中写了一些代码和类似的条件,一切都好。 情况就是这样(有很多列表框和命名变量,最后用数字表示,例如:listAttachment1,listAttachment2,listAttachment3,..等)。为了最好的解释显示我的代码:

public void refreshAttachmentList(ListlistOfControlsRequest,int identifier)         {

    string valueName = "attachmentsField_"+identifier;

        var mylistAttachment = ((FrameworkElement)System.Windows.Application.Current.RootVisual).FindName(valueName);
        ListBox listAttachRequest = mylistAttachment as ListBox;

        listAttachRequest.ClearValue(ItemsControl.ItemsSourceProperty);
        listAttachRequest.ItemsSource = listOfAttachmentsControls;
        listAttachRequest.....all properties

}