首页 > 解决方案 > 在运行时创建通用对象

问题描述

我正在使用拖放制作一个应用程序,我基本上想要的是在我将对象从列表中拖动到“主要区域”时创建一个新对象。我有一个抽象类

public abstract class SymbolModel

还有 2 个(需要更多)类继承自它

public class ValveModel : SymbolModel
public class LightBulbModel : SymbolModel

当我拖放时它会显示出来,但是当我拖动多个时它们都是一样的。我已经做了一个点击功能,它可以点击所有我只想在点击的地方做的事情。我的 dragfrom 方法如下所示:

private void UIElement_OnMouseMove(object sender, MouseEventArgs e)
    {
       TextBlock txtBlock = sender as TextBlock;
        if (txtBlock == null) return;
        if (!(txtBlock.DataContext is SymbolModel)) return;
        if (e.LeftButton == MouseButtonState.Pressed)
        {
            DataObject data = new DataObject();
            data.SetData("Object", (SymbolModel) txtBlock.DataContext);
            DragDrop.DoDragDrop(this, data, DragDropEffects.Copy | DragDropEffects.Move);
        }
    }

我的 drop 方法如下所示:

 private void SymbolView_OnDrop(object sender, DragEventArgs e)
    {
        Point pos = e.GetPosition(SymbolViewControl);
        Console.WriteLine(e.Data.GetData("Object").ToString());
        SymbolModel obj = (SymbolModel) e.Data.GetData("Object");
        obj.CanvasTopImage = pos.Y;
        obj.CanvasLeftImage = pos.X;
        _symbolViewModel.Symbols.Add(obj);
    }

我的点击方法在这里:

 private void ButtonBase_OnClick(object sender, RoutedEventArgs e)
    {
        if (!(sender is Button btn)) return;
        if (!(btn.DataContext is SymbolModel)) return;
        SymbolModel symbol = (SymbolModel) btn.DataContext;
        foreach (SymbolModel sym in _symbolViewModel.Symbols)
        {
            Console.WriteLine(sym.Id);
        }

        if (symbol.ImageName.Equals("valve_green.png"))
        {
            symbol.ImageName = "valve_red.png";
        }
        else
        {
            symbol.ImageName = "valve_green.png";
        }
    }

我想在这里发生的是,当它被丢弃时,它成为一个独立于其他实体的新实体。

希望这是有道理的!谢谢!

标签: c#wpfabstractinstantiation

解决方案


因此,我通过将 drop 方法更改为:

private void SymbolView_OnDrop(object sender, DragEventArgs e)
    {
        Point pos = e.GetPosition(SymbolViewControl);
        Console.WriteLine(e.Data.GetData("Object").ToString());
        SymbolModel obj = (SymbolModel) e.Data.GetData("Object");
        Type t = obj.GetType();
        var symbol = (SymbolModel)Activator.CreateInstance(t);
        symbol.CanvasTopImage = pos.Y;
        symbol.CanvasLeftImage = pos.X;
        _symbolViewModel.Symbols.Add(symbol);
    }

看来激活器是我需要的。


推荐阅读