У меня есть несколько текстовых блоков в моем корневом расположении пользовательского элемента управления, проблема в том, как я могу найти конкретный текстовый блок по его имени?

Спасибо

5
BreakHead 22 Фев 2011 в 12:47

3 ответа

Лучший ответ
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();
7
herzmeister 24 Фев 2011 в 12:46

Если вы создаете UserControl, любой элемент, который вы называете через x:Name, должен быть доступен вам как поле в вашем коде программной части.

Если вы не создаете UserControl, вы можете выполнить поиск в визуальном дереве с помощью Linq to VisualTree...

TextBlock block = LayoutRoot.Descendants<TextBlock>()
                            .Cast<TextBlock>()
                            .SingleOrDefault(t => t.Name == "TextBlockName");
3
ColinE 22 Фев 2011 в 13:31
Когда я компилирую приведенный выше код, он выдает ошибку LayoutRoot не имеет возможности потомка
 – 
BreakHead
22 Фев 2011 в 14:25
Вы читали указанную страницу: scottlogic. co.uk/blog/colin/2010/03/linq-to-visual-tree? Вы должны включить "using LinqToVisualTree;"
 – 
ColinE
22 Фев 2011 в 14:41
+1, потому что это может быть просто вопрос присвоения им x: Name.
 – 
AnthonyWJones
22 Фев 2011 в 16:07
@BreakHead: рассмотрите эту версию того же: geekswithblogs.net/codingbloke/archive/2010/12/19/…
 – 
AnthonyWJones
22 Фев 2011 в 16:07

Привет, Масн, в моем случае я написал код и похожие условия, и все в порядке. это так (есть много списков и именованных переменных, различающихся по номерам в конце имени. Пример: listAttachment1, listAttachment2, listAttachment3, .., и т. д.). Для лучшего объяснения покажите мой код:

Public void refreshAttachmentList (ListlistOfControlsRequest, int идентификатор) {

    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

}

1
TheIberianMan 13 Июл 2015 в 17:04