Не удается увидеть именованный элемент управления Silverlight в коде - PullRequest
4 голосов
/ 03 декабря 2009

В первые несколько часов работы с Silverlight 3 как заядлый пользователь WPF я очень разочарован многими вещами, которые он не поддерживает. Мне кажется, что это странная проблема, и она настолько общая, что я ничего не могу найти в Интернете.

У меня есть следующий XAML:

<controls:TabControl x:Name="workspacesTabControl" Grid.Row="1"
Background="AntiqueWhite" ItemsSource="{Binding Workspaces, ElementName=_root}"/>

Однако я не вижу workspacesTabControl в коде позади. Я подумал, что, возможно, IntelliSense просто значит, и попытался все равно скомпилировать, но получил ошибку:

Error   1   The name 'workspacesTabControl' does not exist in the current context

Как получить доступ к элементам управления в коде позади?

РЕДАКТИРОВАТЬ: я понял, что вставил неправильную ошибку - у меня есть два элемента управления внутри UserControl, называемые workspacesTabControl и menuStrip. Я не могу найти ни одного из них по имени в коде позади.

На всякий случай, вот XAML для menuStrip:

<controls:TreeView Grid.ColumnSpan="2" Height="100" x:Name="menuStrip"
                   ItemContainerStyle="{StaticResource MenuStripStyle}"
                   ItemsSource="{Binding Menu, ElementName=_root}"/>

ИЗМЕНИТЬ СНОВА:

Я не уверен, что это полезно, но я взглянул на InitializeComponent() код и вот что я увидел:

[System.Diagnostics.DebuggerNonUserCodeAttribute()]
public void InitializeComponent() {
    if (_contentLoaded) {
        return;
    }
    _contentLoaded = true;
    System.Windows.Application.LoadComponent(this, new System.Uri("/SapphireApplication;component/SapphireMain.xaml", System.UriKind.Relative));
}

Кажется, что он просто загружает XAML при запуске (не до или во время компиляции), поэтому имена menuStrip и workspacesTabControl фактически нигде не регистрируются (как они обычно находятся в формах WPF / win). Может ли этот атрибут быть проблемой? И где мне избавиться от этого требования для всех будущих пользовательских контролей, которые я делаю?

Ответы [ 7 ]

22 голосов
/ 19 марта 2010

Проверьте свойства в VS для самого файла xaml ... убедитесь, что для параметра Build Action установлено значение Page.

2 голосов
/ 14 декабря 2009

Как бы нелепо это ни звучало, я прибег к использованию метода FindName () для доступа к именованным элементам в выделенном коде:

this.FindName("workspacesTabControl") as TabControl

Я понимаю, что это нелепо, но сейчас я вынужден использовать это. Пожалуйста, дайте мне знать, если кто-то еще сталкивался с этой проблемой и нашел лучшее решение!

1 голос
/ 04 декабря 2009

При первом создании элемента управления Visual Studio не принимает его с помощью intellisense. Однако после того, как вы попытаетесь построить проект, он должен стать доступным. Вы также можете просто ввести имя без intellisense и затем создать его. Я не проверял это, но я слышал, что это было в списке вещей, которые нужно исправить в SL4.

При этом, если вы назовете элемент управления внутри таблички данных, этот элемент управления не будет напрямую доступен в коде позади. Это то же самое для WPF, однако.

0 голосов
/ 04 декабря 2009

Убедитесь, что у вас нет элементов управления, использующих то же имя класса, что и имя пространства имен. Например:

namespace Solution.ProjectName.workspacesTabControl
{  
    public class workspacesTabControl
    {
        ...
    }
}  

Это также даст вам эту ошибку.

Удачи,
Mark

0 голосов
/ 04 декабря 2009

Как уже упоминалось, он должен просто появиться в Intellisense, однако тот факт, что вы получаете ошибку, связанную с чем-то другим, то есть "menuStrip", вероятно, мешает Intellisense. Устраните эту ошибку, и вы, вероятно, обнаружите, что можете получить доступ к элементу управления «workspacesTabControl».

Возможно, вы используете какой-то пример кода или что-то, где они назвали элемент управления "menuStrip" и переименовали его?

Удачи

0 голосов
/ 04 декабря 2009

Я видел ту же проблему в моей разработке Silverlight. В зависимости от моей проблемы, мои именованные элементы управления были вложены в другие элементы управления (то есть сетку данных), и я не смог получить к ним доступ в своем коде. Любые именованные элементы управления на том же уровне вложенности или выше ранее упомянутой сетки данных работали нормально, но все, что находилось внутри, было потеряно в пропасти.

0 голосов
/ 04 декабря 2009

Вы должны увидеть это в коде, эта часть работает так же, как WPF, возможно, если вы решите проблему с помощью menuStrip, то Visual Studio сможет построить патч xaml страницы и все сможет для доступа к вкладке управления

...