# .NET

Source: https://docs.interop.io/desktop/capabilities/windows/workspaces/net/index.html

## Overview

The Workspaces API is accessible via the `io.Workspaces` object.

The .NET Workspaces API enables you to determine whether an [io.Connect Window](https://docs.interop.io/desktop/capabilities/windows/window-management/net/index.md) is currently in a Workspace, to retrieve snapshots and contexts of Workspaces, and to subscribe for events related to windows participating in Workspaces.

## Determining if a Window is in a Workspace

To determine whether a window is in a Workspace, use the `IsInWorkspace()` method and pass as an argument the `IGDWindow` object describing the respective window:

```csharp
bool isInWorkspace = await io.Workspaces.IsInWorkspace(targetWindow);
```

## Workspace Context

To retrieve the context of the Workspace in which a window participates, use the `GetWorkspaceContext()` method and pass as an argument the `IGDWindow` object describing the respective window:

```csharp
IContext context = await io.Workspaces.GetWorkspaceContext(targetWindow);
```

## Workspace Snapshot

To retrieve a snapshot of a Workspace, use the `GetWorkspaceSnapshot()` method and provide the ID of the respective Workspace:

```csharp
WorkspaceSnapshot snapshot = await io.Workspaces.GetWorkspaceSnapshot("workspace-id");

Console.WriteLine($"Workspace ID: {snapshot.Id}, Workspace title: {snapshot.Title}.");
```

The `WorkspaceSnapshot` object has the following properties:

| Property | Type | Description |
|----------|------|-------------|
| `FrameId` | `string` | ID of the Workspaces App in which the Workspace is currently opened. |
| `Id` | `string` | ID of the Workspace. |
| `IsSelected` | `bool` | Indicates whether the Workspace tab is currently selected. |
| `LayoutName` | `string` | Name of the Workspace Layout. |
| `PositionIndex` | `int` | Indicates the position of the Workspace tab among the other Workspace tabs currently opened in the Workspaces App. |
| `Title` | `string` | Title of the Workspace. |
| `Windows` | `Item[]` | List of objects describing the windows participating in the Workspace. |
| `WorkspaceItem` | `Item` | Object describing the Workspace. |

## Events

To subscribe for events related to windows participating in Workspaces, use the `SubscribeWindowEvent()` method and pass a callback function for handling the event. The callback will receive a `WorkspaceEvent` object as an argument. Use this object to determine the type of the event, the io.Connect Window to which it's related, and the Workspace in which the respective window participates:

```csharp
IDisposable subscription = await io.Workspaces.SubscribeWindowEvent((е) =>
{
    // Handling a specific event.
    if (е.Action == WorkspaceEvent.Added)
    {
        Console.WriteLine($"Window with ID {е.WindowId} was added to Workspace with ID {е.WorkspaceId}.");
    }
    else
    {
        Console.WriteLine($"Event {е.Action} fired for window with ID {е.WindowId}.");
    };
});

// Closing the subscription.
subscription.Dispose();
```

Upon successful subscription, the `SubscribeWindowEvent()` method returns a subscription object of type `IDisposable`. Use its `Dispose()` method to stop receiving event notifications.

The `WorkspaceEvent` object has the following properties:

| Property | Type | Description |
|----------|------|-------------|
| `Action` | `WindowEventAction` | Type of the event (e.g., window added, removed, maximized, and more). |
| `Window` | `IGDWindow` | Object describing the [io.Connect Window](https://docs.interop.io/desktop/capabilities/windows/window-management/net/index.md) to which the event is related. |
| `WindowId` | `string` | ID of the io.Connect Window to which the event is related. |
| `WorkspaceId` | `string` | ID of the Workspace in which the window participates. |

The `WindowEventAction` enumeration describes the available events and has the following members:

| Member | Description |
|--------|-------------|
| `Added` | Indicates the event fired when a window is added to a Workspace. |
| `Loaded` | Indicates the event fired when a window has finished loading in a Workspace. |
| `LockConfigurationChanged` | Indicates the event fired when the [lock settings](https://docs.interop.io/desktop/capabilities/windows/workspaces/overview/index.md#using_workspaces-locking_workspaces) for a window in a Workspace are changed. |
| `Maximized` | Indicates the event fired when a window is maximized in a Workspace. |
| `Removed` | Indicates the event fired when a window is removed from a Workspace. |
| `Restored` | Indicates the event fired when a window is restored in a Workspace after being maximized. |
| `Selected` | Indicates the event fired when the tab of a window is selected. It's important to keep in mind that when this event is fired, this doesn't automatically mean that the window is on focus - e.g., the window may be in a Workspace that's not currently on focus and its tab may have been selected programmatically. |
