所有
我有一个简单的课程。
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中是不正确的?
我的最终目标是创建一个可重用的容器,但继承了我在整个链中指定的所有属性/方法。
感谢任何帮助。
答案 0 :(得分:2)
问题是,MaskContainer
有一个附加的XAML文件,这使得WPF codegen生成一个实现System.Windows.Markup.IComponentConnector
的类。当控件实现该接口时,它会收到一个全新的质量:它成为命名范围根。这意味着在这样的控件内部,存在完整的单独命名空间。外面的控制名称与内部控件名称不冲突。
在这种特殊情况下,这意味着maskCanvas
和button1
在名称mainpage
中都不可见,但在MaskContainer
内可见。
事实上,我很惊讶你甚至设法以某种方式编译。根据我的经验,如果你使用Visual Studio尝试这个技巧,它会抱怨maskCanvas
在元素MaskContainer 的范围内是“”。您是否有机会使用命令行编译?
好的,已经足够的等等等等。
解决方案是什么?只需从MaskContainer
删除XAML文件即可。这将摆脱自动生成的IComponentConnector
实现,一切都将按预期工作。
答案 1 :(得分:0)
在检查变量之前,验证是否正在调用InitializeComponent() 。
否则这些变量肯定会为空。
我做了上面没有问题,虽然通常使用其他控件,如Grid,Canvas等。
要检查的另一件事是:Container类是否有Xaml?我不相信你可以在已经使用Xaml的类上继承和使用Xaml。
答案 2 :(得分:0)
我实际上发现在当前的RC下,你不能像我想要的那样扩展用户控件。我最终解决问题(目前)是为了愚弄系统的期望并扩展Canvas而不是用户控件本身。我本来希望扩展用户控件,但是哦。这就足够了。