如何在XAML中使用C#自定义子类?

7 c# wpf inheritance xaml

这是我的问题:我想在MyWindow中使用SurfaceInkCanvas的子类.我创建了一个这样的C#类:

namespace MyNamespace
{
    public class SubSurfaceInkCanvas : SurfaceInkCanvas
    {
       private MyWindow container;

       public SubSurfaceInkCanvas()
           : base()
       {
       }

       public SubSurfaceInkCanvas(DrawingWindow d) : base()
       {
           container = d;
       }

       protected override void OnTouchDown(TouchEventArgs e)
        {
            base.OnTouchDown(e);     
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

我想在我的XAML窗口中使用它.这是这样的吗?

<MyNamespace:SubSurfaceInkCanvas
    x:Name="canvas"
    Background="White"
    TouchDown="OnTouchDown"/>
Run Code Online (Sandbox Code Playgroud)

我完全走错了路吗?

m-y*_*m-y 7

您需要导入Xml命名空间才能使用类...

<Window x:Class="Namespace.SomeWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"> ... </Window>
Run Code Online (Sandbox Code Playgroud)

请注意命名空间的导入方式.默认的(无前缀)可以是您想要的任何内容,但最好将其留给Microsoft的演示文稿命名空间.然后是"x"命名空间,它是基本的xaml命名空间(当然你可以改变前缀,但你应该保持原样).

因此,为了向它添加自己的命名空间,有两种方法(一种方法是本地的).

  • CLR的命名空间: xmlns:<prefix>="clr-namespace:<namespace>;Assembly=<assemblyName>"
  • URI的命名空间: xmlns:<prefix>="<uri>"

在您的情况下,您可能希望将前缀设置为"本地"并使用CLR命名空间(因为它是您可以使用的全部).

导入:xmlns:local="clr-namespace:MyNamespace;Assembly=???"
用法:<local:SubSurfaceInkCanvas ... />


或者,如果这些类位于外部库中,则可以将CLR命名空间映射到XML命名空间...请参阅此答案以获取对此的详细说明.