簡體   English   中英

在運行時創建通用對象

[英]Creating generic object on runtime

我正在通過拖放創建一個應用程序,而我基本上想要的是在將對象從列表中拖入“主區域”時創建一個新對象。 我有一個抽象課

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);
        }
    }

我的放置方法如下所示:

 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";
        }
    }

我要在這里發生的事情是,當它被丟棄時,它成為一個獨立於其他實體的新實體。

希望這有道理! 謝謝!

所以我通過將放置方法更改為:

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);
    }

看來激活器正是我所需要的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM