所有,
我有一堂简单的课。
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
的类。当控件实现该接口时,它将获得全新的质量:它成为命名作用域的根。这意味着在这样的控件内部,有一个完整的命名空间。外部控件名称与内部控件名称不冲突。
在这种特殊情况下,这意味着maskCanvas
和button1
都不能在名称上从mainpage
内部看到,而是从MaskContainer
内部可见。
实际上,我很惊讶您甚至设法以某种方式进行了编译。根据我的经验,如果您使用Visual Studio尝试此技巧,它将抱怨maskCanvas
在“元素MaskContainer的范围内”。您是否会偶然使用命令行编译?
好吧,已经足够等等了。
有什么解决办法?只需从MaskContainer
删除XAML文件。这将摆脱自动生成的IComponentConnector
实现,一切将按您期望的那样工作。
关于c# - 为什么此用户控件扩展中的所有对象在运行时都为空?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/2541009/