为什么usercontrol的这个扩展中的所有对象在运行时都为null?

时间:2010-03-29 20:23:28

标签: c# .net wpf silverlight-4.0

所有

我有一个简单的课程。

public class Container : UserControl
{
    public bool IsClickable { get; set; }
}

我有一个扩展此课程的课程。

public class ScrollingContainer : Container
{
    public void Draw()
    {

    }

    public void Update()
    {

    }
}

我有一个自定义类,然后扩展ScrollingContainer。

public partial class MaskContainer : ScrollingContainer
{

    public MaskContainer()
    {
        InitializeComponent();
    }
}

XAML

<local:ScrollingContainer x:Class="Test.Types.MaskContainer"
    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:local="clr-namespace:GameObjects;assembly=GameObjects"
    mc:Ignorable="d"
    >
</local:ScrollingContainer>

在我的mainpage.xaml中,我有以下内容。

<types:MaskContainer x:Name="maskContainer" Canvas.ZIndex="1" Width="Auto" Height="Auto">
       <Canvas x:Name="maskCanvas">
           <Button x:Name="button1" Content="test button"/>
       </Canvas>
</types:MaskContainer>

为什么在运行时,maskCanvas和button1都是null? maskContainer不为null。

这里的继承应该是直截了当的。 Container继承usercontrol。可滚动容器继承容器。 Mask Container继承可滚动容器。为什么我在这个级别失去原始基类的功能?将元素(button1)添加到main.xaml内的maskcontainer中是不正确的?

我的最终目标是创建一个可重用的容器,但继承了我在整个链中指定的所有属性/方法。

感谢任何帮助。

3 个答案:

答案 0 :(得分:2)

问题是,MaskContainer有一个附加的XAML文件,这使得WPF codegen生成一个实现System.Windows.Markup.IComponentConnector的类。当控件实现该接口时,它会收到一个全新的质量:它成为命名范围根。这意味着在这样的控件内部,存在完整的单独命名空间。外面的控制名称与内部控件名称不冲突。

在这种特殊情况下,这意味着maskCanvasbutton1在名称mainpage中都不可见,但在MaskContainer内可见。

事实上,我很惊讶你甚至设法以某种方式编译。根据我的经验,如果你使用Visual Studio尝试这个技巧,它会抱怨maskCanvas在元素MaskContainer 的范围内是“”。您是否有机会使用命令行编译?

好的,已经足够的等等等等。

解决方案是什么?只需从MaskContainer删除XAML文件即可。这将摆脱自动生成的IComponentConnector实现,一切都将按预期工作。

答案 1 :(得分:0)

在检查变量之前,验证是否正在调用InitializeComponent()

否则这些变量肯定会为空。

我做了上面没有问题,虽然通常使用其他控件,如Grid,Canvas等。

要检查的另一件事是:Container类是否有Xaml?我不相信你可以在已经使用Xaml的类上继承和使用Xaml。

答案 2 :(得分:0)

我实际上发现在当前的RC下,你不能像我想要的那样扩展用户控件。我最终解决问题(目前)是为了愚弄系统的期望并扩展Canvas而不是用户控件本身。我本来希望扩展用户控件,但是哦。这就足够了。