C# 一个在模板中有画布的类派生控件,我想像画布一样工作
我有一个从Windows.Controls.Control派生的类Tableau,其模板包含画布: 我想把它用作画布,类似这样: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
<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; }
}
}