无法在代码中看到命名的Silverlight控件

4
在我接触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的控件。我无法通过它们的名称在代码后台访问任何一个。

以防万一,这里是menuStrip的XAML:

<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(不是在编译期间或之前),因此menuStripworkspacesTabControl名称实际上没有在任何地方注册(通常在WPF/win Forms中会注册)。这个属性可能是一个问题吗?我在哪里可以摆脱这个要求,以便所有未来的用户控件都可以使用?

无法重现您的问题。 - AnthonyWJones
好奇问一下,你的UserControl上的x:Class设置为什么? - JerKimball
7个回答

22

在VS中检查xaml文件本身的属性...确保Build Action设置为Page。


3
我曾遇到这个问题,这种方法对我有效。我需要将“Build Action”设置为“Page”,然后在XAML中做一些更改以便VS重新编译该页面。 - Brandon Montgomery
这是我的问题,而且它起作用了。此外,感谢Brandon建议重新编译XAML。 - thepaulpage
2
当我将一个包含xaml和.cs文件的项目从一个工程复制到另一个工程时,构建操作被设置为ApplicationDefinition而不是Page。将其改回来,注释掉所有的代码后台,重新构建并取消注释所有的代码后台,这样问题就得到了解决。 - Mr. Bungle
谢天谢地有这篇文章!我刚刚把一个用户控件从一个项目复制到另一个项目,结果出了这种问题。真是让人头疼 :( - Mark Evans

2

虽然听起来很荒谬,但我已经不得不使用FindName()方法在代码后台中访问命名项:

this.FindName("workspacesTabControl") as TabControl

我知道这种方法很荒谬,但现在我被迫使用它。如果有人遇到过这个问题并且想出了更好的解决方案,请告诉我!


1

当您首次创建控件时,Visual Studio不会使用智能感知来捕获它。但是,在尝试构建项目后,它应该变得可用。您也可以在没有智能感知的情况下输入名称,然后构建它。我还没有验证过这一点,但我听说这是SL4中需要修复的问题之一。

话虽如此,如果您在数据模板内部命名控件,则无法直接在代码后台访问该控件。这对于WPF也是如此。


我知道这很老,但是这个答案的第二段帮了我 - 我不知道这个事实,必须用另一种方式控制它。 - Lindsay

0

请检查您是否有任何控件使用与命名空间名称相同的类名。例如:

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

这也会给你带来这个错误。

祝你好运,
马克


这不是这样的。我的定义如下: namespace SapphireApplication { public partial class SapphireMain : UserControl { - Alexandra

0

你应该能够在代码后台看到它,这部分与WPF的工作方式相同,也许如果你修复了menuStrip的问题,那么Visual Studio就能够构建页面的xaml部分,然后你就能够访问tabcontrol了。


0

我在我的Silverlight开发中也看到了同样的问题。具体来说,我的命名控件嵌套在其他控件中(如数据表格),我无法在代码后台访问它们。与前面提到的数据表格处于相同嵌套级别或更高级别的任何带名称的控件都可以正常工作,但是任何嵌套在其中的控件都会消失在深渊之中。


0

如前所述,它应该只出现在Intellisense中,但是您得到与其他内容相关的错误,即“menuStrip”,可能会干扰Intellisense。解决该错误,您可能会发现可以访问“workspacesTabControl”控件。

您可能正在使用一些示例代码或命名了一个名为“menuStrip”的控件并将其重命名了吗?

祝你好运


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接