所有,

我有一堂简单的课。

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都为空? maskContainer不为null。

这里的继承应该很简单。容器继承了usercontrol。可滚动容器继承了容器。遮罩容器继承了可滚动容器。为什么我在此级别上失去了原始基类的功能?将元素(button1)添加到main.xaml内部的maskcontainer是否正确?

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

任何帮助表示赞赏。

最佳答案

问题是,MaskContainer具有附加的XAML文件,这使WPF代码生成了一个实现System.Windows.Markup.IComponentConnector的类。当控件实现该接口时,它将获得全新的质量:它成为命名作用域的根。这意味着在这样的控件内部,有一个完整的命名空间。外部控件名称与内部控件名称不冲突。

在这种特殊情况下,这意味着maskCanvasbutton1都不能在名称上从mainpage内部看到,而是从MaskContainer内部可见。

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

好吧,已经足够等等了。

有什么解决办法?只需从MaskContainer删除XAML文件。这将摆脱自动生成的IComponentConnector实现,一切将按您期望的那样工作。

关于c# - 为什么此用户控件扩展中的所有对象在运行时都为空?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/2541009/

10-10 12:36