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_Inheritance - Fatal编程技术网

C# 创建用于存储额外信息并将其链接到宿主类的类

C# 创建用于存储额外信息并将其链接到宿主类的类,c#,wpf,inheritance,C#,Wpf,Inheritance,所以我一直在想最好的办法,但最后总是在某处碰壁 基本上,我的问题是:我有一个可以绘制UIElement类型项的层。在我的例子中,我需要能够绘制两种类型的元素,图像和形状。它们都是从UIElement继承的 现在我想创建一个我自己的类,让我们将该类称为LayerItem。LayerItem包含有关特定项的一些附加信息,例如名称 我的第一个解决方案是从Image类继承LayerItem并添加新字段。通过这种方式,我还能够捕获图像对象接收到的所有事件(例如MouseOver),然后将对象强制转换为La

所以我一直在想最好的办法,但最后总是在某处碰壁

基本上,我的问题是:我有一个可以绘制UIElement类型项的层。在我的例子中,我需要能够绘制两种类型的元素,图像和形状。它们都是从UIElement继承的

现在我想创建一个我自己的类,让我们将该类称为LayerItem。LayerItem包含有关特定项的一些附加信息,例如名称

我的第一个解决方案是从Image类继承LayerItem并添加新字段。通过这种方式,我还能够捕获图像对象接收到的所有事件(例如MouseOver),然后将对象强制转换为LayerItem以检索额外的相关信息。显示图像是通过设置对象的源属性来完成的

但是,如果对象也可以是形状,则此方法不起作用,因为形状没有源属性

基本上,我所寻找的是实现这一点的“正确方式”,即允许我直接使用事件的方式。我目前唯一能想到的解决方案是使用一个字典将UIElement映射到LayerItems,然后使用引发事件的UIElement从那里获取LayerItem。那么,有没有更好、也许更复杂的方法来实现这一点呢

编辑:

谢谢你的回复,但我不确定这正是我想要的。让我试着澄清一下。基本上,我有一个图层,我可以在上面画不同的东西(图像或形状),方法是将有问题的图形添加到图层上并给出坐标

这个想法是用户可以点击图层,从一个列表中选择他/她想要用什么样的图形来表示添加的项目。关于该项目的额外信息,如id和名称,存储在数据库中,我需要一种方法将这些信息链接到图形项目

因此,所有这些都将由代码处理,动态地创建和删除项目。这也是事件发生的原因。为了能够识别用户单击的项目(显示额外信息、允许拖放等),我认为UIElement生成的事件最容易使用

关于提供代码作为示例,这有点困难,因为这在很大程度上取决于实现:)但如果我的解释仍然不够清楚,我肯定可以尝试提出一些建议

似乎可以用于存储层所需的额外信息

msdn页面上有一个很好的示例

<DockPanel>
  <CheckBox DockPanel.Dock="Top">Hello</CheckBox>
</DockPanel>

你好

Checkbox
没有定义
Dock
属性,
DockPanel
有定义。现在,任何元素都可以设置
Dock
属性。

我将首先创建UIElement的LayerItem后代,然后创建LayerItem的所有其他所需类的后代。最终层次结构如下所示:

class LayerItem
{
    public string Name { get; set; }

    public event EventHandler ItemEvent;
    protected virtual void OnItemEvent(EventArgs e)
    {
    if (this.ItemEvent != null)
        this.ItemEvent(this, e);
    }
}

class ImageLayerItem : LayerItem
{
    private Image _image;

    public ImageLayerItem()
    {
        //here create Image element and think of rendering it.
        _image = new Image();
        //attach event handlers.
        _image.Click += ... //don't forget to call LayerItem.OnItemEvent() inside the event handler.
    }
}
  • UIElement
    • 分层
      • 影像层
      • ShapeLayerItem
      • 等等
而且,如果您希望LayerItem报告子类中的任何事件,则只需将该事件放入LayerItem中,并让子类在其自己的事件上引发该事件,如下所示:

class LayerItem
{
    public string Name { get; set; }

    public event EventHandler ItemEvent;
    protected virtual void OnItemEvent(EventArgs e)
    {
    if (this.ItemEvent != null)
        this.ItemEvent(this, e);
    }
}

class ImageLayerItem : LayerItem
{
    private Image _image;

    public ImageLayerItem()
    {
        //here create Image element and think of rendering it.
        _image = new Image();
        //attach event handlers.
        _image.Click += ... //don't forget to call LayerItem.OnItemEvent() inside the event handler.
    }
}
此外:

  • 我建议在LayerItem中使用具有相应特殊事件参数类型的特殊事件处理程序类型,而不仅仅是EventHandler和EventArgs。一个很好的例子是LayerItemEventArgs,它包含一个子类(如ImageLayerItem)引发的事件的名称及其参数。这样,您可以通过仅处理LayerItem.ItemEvent事件来处理所有事件;或者,您可以将子类的事件作为经典方法处理

我希望这有助于成为前进的起点。

我相信我的答案可能正是您想要的,尽管我不确定我是否正确理解这些事件与此相关。如果您需要更多的帮助,也许可以进一步澄清一下。请提供更多信息:您需要通过代码或标记创建它们吗?请举例说明你认为应该如何使用它。代码/标记示例将是完美的。这个问题确实很有趣:-)这似乎是一个相当不错的解决方案,我会马上测试它!谢谢