4

我正在编写自己的调试器可视化器。所有这些都非常适合向可视化器展示数据。

现在我添加代码以更清晰:

public class MyVisualiserObjectSource : VisualizerObjectSource
{
    public override void GetData(object target, Stream outgoingData)
    {
        string data= target as string;
        var writer = new StreamWriter(outgoingData);
        writer.Write(data);
        writer.Flush();
    }    
}

public class MyVirtualizer : DialogDebuggerVisualizer
{
    protected override void Show(IDialogVisualizerService windowService, IVisualizerObjectProvider objectProvider)
    {
        var streamReader = new StreamReader(objectProvider.GetData());

        string data = streamReader.ReadToEnd();

        using (var form = new MyVirtualizerForm(data))
        {
            windowService.ShowDialog(form);


        }

    }
}

这里的字符串被传递给可视化器并显示我自己的表单。有用。但现在我想将修改后的数据从表单传回给变量。

我怎么做?

编辑:

我发现我需要重写TransferData. VisualizerObjectSource但是在MSDN中没有关于我如何正确实现这一点的详细信息。

有人能帮助我吗?

编辑2:

我用 IL-Spy 看了什么TransferData方法。它抛出一个异常。所以我重写了这个方法。但它仍然无法正常工作。在 中incomingData是修改后的字符串Form。但我没有把这个值取回变量:(

public class StringVisualiserObjectSource : VisualizerObjectSource
    {
        public override void GetData(object target, Stream outgoingData)
        {
            var data = target as string;
            var writer = new StreamWriter(outgoingData);
            writer.Write(data);
            writer.Flush();

        }

        public override void TransferData(object target, Stream incomingData, Stream outgoingData)
        {
            incomingData.CopyTo(outgoingData);
        }

    }
4

1 回答 1

0

您只需要在表单中添加一个公共属性,其中包含您希望“传回”的数据。例如,如果您的表单包含一个名为 MyDataTextBox 的文本框,您需要在表单上创建一个公共属性,例如:

public MyVirtualizerForm : System.Windows.Form
{
    public string MyData
    {
     get{ return MyDataTextBox.Text;}
    }
}

然后,您可以通过执行以下操作在关闭表单时访问文本框的文本:

已编辑 - 将数据传递回变量

这假设您从表单返回的数据是一个字符串。

  using (var form = new MyVirtualizerForm(data))
  {
            windowService.ShowDialog(form);
            var formData = form.MyData;

            using (MemoryStream returnStream = 
               new MemoryStream(ASCIIEncoding.Default.GetBytes(formData)))
            {
               objectProvider.TransferData(returnStream);
            }
   }

这是你想要达到的目标吗?此外,您可能会发现以下链接可用作参考:http: //msdn.microsoft.com/en-us/library/microsoft.visualstudio.debuggervisualizers.ivisualizerobjectprovider.transferdata.aspx

于 2012-11-20T21:51:14.347 回答