Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/14.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# 如何在WPF面板中显示虚拟工作室的视图?_C#_Wpf - Fatal编程技术网

C# 如何在WPF面板中显示虚拟工作室的视图?

C# 如何在WPF面板中显示虚拟工作室的视图?,c#,wpf,C#,Wpf,我有启动外部dll文件引擎的代码,并显示在此dll文件中创建的虚拟工作室的视图。该代码在Windows窗体中运行良好。现在,当我尝试在WPF中使用相同的代码时,它会抱怨显示输出的最后一行,这一行涉及窗口处理。我对下面的代码不太熟悉,也不太了解委托和处理,但有人能帮我在WPF中运行吗 namespace MSShowTestGUI { public delegate void CallbackDelegate(); public delegate void Notifica

我有启动外部dll文件引擎的代码,并显示在此dll文件中创建的虚拟工作室的视图。该代码在Windows窗体中运行良好。现在,当我尝试在WPF中使用相同的代码时,它会抱怨显示输出的最后一行,这一行涉及窗口处理。我对下面的代码不太熟悉,也不太了解委托和处理,但有人能帮我在WPF中运行吗

namespace MSShowTestGUI
    {
    public delegate void CallbackDelegate();
    public delegate void NotificationsCallbackDelegate(CinectorNotification message);

public partial class Form1 : Form
{

    MSShowAPI.API instance = new API();

    //List<AudioDevice> audioDevices = new List<AudioDevice>();
    //List<CameraDevice> cameraDevices = new List<CameraDevice>();

    CallbackDelegate clickIntoDeleg;
    IntPtr clickIntoPointer;

    NotificationsCallbackDelegate notificationsCallbackDeleg;
    IntPtr notificationsCallbackPointer;

    bool engineRunning = false;

    public Form1()
    {   
        InitializeComponent();

        if (checkBox_autostart.Checked)
        {
            InitializeEngine2();
        }

        Application.Idle += Update;
        clickIntoDeleg = ClickIntoCallback;
        clickIntoPointer = Marshal.GetFunctionPointerForDelegate(clickIntoDeleg);
        instance.SetClickIntoCallback(clickIntoPointer);

        notificationsCallbackDeleg = NotificationsCallback;
        notificationsCallbackPointer = Marshal.GetFunctionPointerForDelegate(notificationsCallbackDeleg);
        instance.SetNotificationsCallback(notificationsCallbackPointer);


        //instance.SetNotificationsCallback()
    }   

    #region initialization

    private void InitializeEngine2()
    {
        UpdateControls();
        if (!engineRunning)
        {
            CallbackDelegate handler = ReadyCallback;
            IntPtr delegPointer = Marshal.GetFunctionPointerForDelegate(handler);

            instance.InitializeEngine(CinectorWindow.Handle, new Resolution(1920, 1080), 1000, delegPointer); //this line shows the view of the studio in a panel but in WPF there is no "CinectorWindow.Handle"          
        }        
    }

    protected void ReadyCallback()
    {
        engineRunning = true;
        instance.SetActiveStudio(0);

        UpdateControls();

        // called only first run?
        /*engineRunning = true;
        UpdateControls();*/
    }

    private void button_initEngine_Click(object sender, EventArgs e)
    {
        InitializeEngine2();
    }

    private void UpdateControls()
    {
        button_initEngine.Enabled = !engineRunning;

        button_killEngine.Enabled = engineRunning;
    }

    private void Form1_FormClosing(object sender, FormClosingEventArgs e)
    {
        ShutdownEngine();
    }

    private void ShutdownEngine()
    {
        if (engineRunning)
        {
            instance.ShutdownEngine();
            engineRunning = false;
        }
        UpdateControls();
    }

    private void button_killEngine_Click(object sender, EventArgs e)
    {
        ShutdownEngine();
    }

    #endregion

    private void ClickIntoCallback()
    {
        //code
    }

    private void NotificationsCallback(CinectorNotification notif)
    {
        notificationBox.AppendText("[" + notif.timestamp + "] " + notif.type + ": " +  notif.message + Environment.NewLine);
    }

    void Update(object sender, EventArgs e)
    {
        instance.Update();
    }


    private void CinectorWindow_Paint(object sender, PaintEventArgs e)
    {

    }

    }
    }
名称空间MSShowTestGUI
{
公共委托void CallbackDelegate();
公共委托无效通知ScallBackDelegate(CinectorNotification消息);
公共部分类Form1:Form
{
MSShowAPI.API实例=新API();
//列出音频设备=新列表();
//List cameraDevices=新列表();
Callback委托点击进入委托;
IntPtr点击输入指针;
通知ScalBackDelegate通知ScalBackDeleg;
IntPtr通知ScallBackpointer;
布尔引擎规划=假;
公共表格1()
{   
初始化组件();
如果(复选框_autostart.Checked)
{
初始化Engine2();
}
Application.Idle+=更新;
clickIntoDeleg=ClickIntoCallback;
clickIntoPointer=Marshal.GetFunctionPointerForDelegate(clickIntoDeleg);
SetClickIntoCallback(clickIntoPointer);
notificationsCallbackDeleg=NotificationsCallback;
notificationsCallbackPointer=Marshal.GetFunctionPointerForDelegate(notificationsCallbackDeleg);
SetNotificationsCallback(notificationsCallbackPointer);
//instance.SetNotificationsCallback()实例
}   
#区域初始化
private void InitializeEngine2()
{
updateControl();
如果(!引擎规划)
{
CallbackDelegate处理程序=ReadyCallback;
IntPtr delegPointer=Marshal.GetFunctionPointerForDelegate(处理程序);
instance.InitializeEngine(CinectorWindow.Handle,新分辨率(1920,1080),1000,delegPointer);//这一行在面板中显示工作室的视图,但在WPF中没有“CinectorWindow.Handle”
}        
}
受保护的void ReadyCallback()
{
引擎规划=真;
SetActiveStudio(0);
updateControl();
//只叫第一次?
/*引擎规划=真;
updateControl()*/
}
私有无效按钮\初始化引擎\单击(对象发送者,事件参数e)
{
初始化Engine2();
}
私有void updateControl()
{
按钮_initEngine.Enabled=!engineRunning;
按钮\u killEngine.Enabled=引擎运行;
}
私有作废Form1\u FormClosing(对象发送方,FormClosingEventArgs e)
{
关闭发动机();
}
私有void关闭引擎()
{
if(发动机润滑)
{
instance.ShutdownEngine();
引擎规划=错误;
}
updateControl();
}
私有无效按钮\u killEngine\u单击(对象发送者,事件参数e)
{
关闭发动机();
}
#端区
私有void ClickIntoCallback()
{
//代码
}
私有无效通知ScalBack(CinectorNotification notif)
{
notificationBox.AppendText(“[”+notif.timestamp+“]”“+notif.type+”:“+notif.message+Environment.NewLine”);
}
无效更新(对象发送方,事件参数e)
{
Update();
}
私有void CinectorWindow_Paint(对象发送器,PaintEventArgs e)
{
}
}
}

编辑:事实证明,不仅Windows有句柄

有一个名为
WindowsFormsHost
的控件,用于在WPF视图中承载WinForms元素,该控件有自己的句柄属性

因此,您只需更改
CinectorWindow
,将其设置为
WindowsFormsHost
,而不是StackPanel,并像您在问题中已经做的那样使用其句柄

--原始答案--

在WPF中,只有Windows具有句柄,并且没有
Handle
属性

要获得窗口的句柄,您需要执行以下操作:

// "this" being the current Window
WindowInteropHelper windowHwnd = new WindowInteropHelper(this);  
IntPtr hWnd = windowHwnd.Handle;

WPF和Windows窗体控件具有不同的属性。请您准确地指出是哪一行代码导致了问题,确切的错误是什么?如果没有这些东西,很难判断实际的问题是什么,我在那行旁边加了一条评论。但这里是:instance.InitializeEngine(CinectorWindow.Handle,新分辨率(19201080),1000,delegPointer);它只是抱怨CinectorWindow没有句柄属性,这是一个StackPanel。啊,是的,我现在看到了它,评论离开了我的屏幕,所以我看不到它。StackPanels没有句柄属性或方法:好的,谢谢。但是我可以用什么来代替呢?我会在工作时做一些检查,这样我可能需要一点时间才能找到你。有没有一种不用手柄的方法?没有,除非你能修改
初始化引擎
代码,并能解释该方法的功能。不幸的是,我没有。该方法是dll中的内部方法,它加载程序的deafult初始状态。所以你们是说,无论我在Windows窗体的绘制面板中看到什么,现在我只能在wpf的新窗口中看到?我想我可能已经找到了一个选项。。。我将编辑我的答案。完成!只要把你的
CinectorWindow
做成一个WindowsFormsHost,你就有希望了。