Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/274.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 一个在模板中有画布的类派生控件,我想像画布一样工作_C#_Wpf_Templates_Canvas_Controls - Fatal编程技术网

C# 一个在模板中有画布的类派生控件,我想像画布一样工作

C# 一个在模板中有画布的类派生控件,我想像画布一样工作,c#,wpf,templates,canvas,controls,C#,Wpf,Templates,Canvas,Controls,我有一个从Windows.Controls.Control派生的类Tableau,其模板包含画布: 我想把它用作画布,类似这样: <local:Tableau> <Rectangle Fill="AliceBlue" Stroke="Black" Width="100" Height="100" Canvas.Top="10"/> <Rectangle Fill="AliceBlue" Stroke="Blac

我有一个从Windows.Controls.Control派生的类Tableau,其模板包含画布:

我想把它用作画布,类似这样:

    <local:Tableau>
            <Rectangle Fill="AliceBlue" Stroke="Black" Width="100" Height="100" Canvas.Top="10"/>
            <Rectangle Fill="AliceBlue" Stroke="Black" Width="100" Height="100" Canvas.Left="130" Canvas.Top="50"/>
    </local:Tableau>

是否可能,如果是,如何定义?

您可以定义一个属性Children,让它从内部画布返回Children集合,并应用该属性。以下是I类测试的修改版本:

[ContentProperty(nameof(Children))]
public class Tableau : Control
{
    static Tableau()
    {
        FrameworkElement.DefaultStyleKeyProperty.OverrideMetadata(
            typeof(Tableau), new FrameworkPropertyMetadata(typeof(Tableau)));
    }

    public Tableau() : base()
    {
        UpdateDefaultStyle();
    }

    private Canvas canvas;
    public Canvas Canvas
    {
        get
        {
            if (canvas == null) { ApplyTemplate(); }
            return canvas;
        }
    }

    public override void OnApplyTemplate()
    {
        base.OnApplyTemplate();
        canvas = (Canvas)GetTemplateChild("Diagram");
    }

    public UIElementCollection Children
    {
        get { return Canvas.Children; }
    }
}

请注意,我使用OnApplyTemplate而不是Loaded,这样即使在加载Tableau之前,我也可以获得内部画布和子集合。我还在构造函数中使用UpdateDefaultStyle,以确保可以尽早加载默认模板。

您可以从ItemsControl派生,并通过样式设置ItemsPanel属性。如果您已经看到我的答案,我只是做了更多的测试并对其进行了更新。现在它应该是一个更完整的解决方案。谢谢,但它不起作用。此公共UIElementCollection子项{get{return Canvas.Children;}有错误。我把画布。孩子换成了画布。孩子但不工作。@Davoud哇,我不知道我以前是怎么认为它工作的。好吧,第三次是魅力。我做了另一次更改并再次测试了它。告诉我它现在是否适用于你。谢谢你的关注。但不要像画布一样工作。当我使用这样的东西时在设计时一切正常,除了移动项必须使用margin not Canvas.SetLeft和top。在运行时,我有一个错误:{Object reference not set to a Object.}at get{return Canvas.Children;}
    <local:Tableau>
            <Rectangle Fill="AliceBlue" Stroke="Black" Width="100" Height="100" Canvas.Top="10"/>
            <Rectangle Fill="AliceBlue" Stroke="Black" Width="100" Height="100" Canvas.Left="130" Canvas.Top="50"/>
    </local:Tableau>
[ContentProperty(nameof(Children))]
public class Tableau : Control
{
    static Tableau()
    {
        FrameworkElement.DefaultStyleKeyProperty.OverrideMetadata(
            typeof(Tableau), new FrameworkPropertyMetadata(typeof(Tableau)));
    }

    public Tableau() : base()
    {
        UpdateDefaultStyle();
    }

    private Canvas canvas;
    public Canvas Canvas
    {
        get
        {
            if (canvas == null) { ApplyTemplate(); }
            return canvas;
        }
    }

    public override void OnApplyTemplate()
    {
        base.OnApplyTemplate();
        canvas = (Canvas)GetTemplateChild("Diagram");
    }

    public UIElementCollection Children
    {
        get { return Canvas.Children; }
    }
}