1
0
mirror of https://gitee.com/csharpui/CPF.git synced 2025-04-05 17:37:51 +08:00
CPF/CPF/Design/DesignPlatform.cs
2023-12-27 15:24:48 +08:00

151 lines
4.4 KiB
C#

using System;
using System.Collections.Generic;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using CPF.Controls;
using CPF.Input;
using CPF.Platform;
using System.Collections.Concurrent;
using CPF.Drawing;
namespace CPF.Design
{
public class DesignPlatform : RuntimePlatform
{
public RuntimePlatform Platform { get; set; }
public override PixelPoint MousePosition => new PixelPoint();
public override TimeSpan DoubleClickTime => throw new NotImplementedException("不能在设计模式下调用");
public override INativeImpl CreateNative()
{
return null;
}
public override INotifyIconImpl CreateNotifyIcon()
{
return null;
}
public override IPopupImpl CreatePopup()
{
return new DesignPopupImpl();
}
public override IWindowImpl CreateWindow()
{
return new DesignWindow();
}
public override DragDropEffects DoDragDrop(DragDropEffects allowedEffects, params (DataFormat, object)[] data)
{
throw new NotImplementedException("不能在设计模式下调用");
}
Screen[] screens = new Screen[] { new Screen(new Rect(0, 0, 1920, 1080), new Rect(0, 0, 1920, 1080), true) };
#if NET40
public override IList<Screen> GetAllScreen()
{
return screens;
}
#else
public override IReadOnlyList<Screen> GetAllScreen()
{
return screens;
}
#endif
public override IClipboard GetClipboard()
{
if (Platform != null)
{
return Platform.GetClipboard();
}
throw new NotImplementedException("不能在设计模式下调用");
}
public override object GetCursor(Cursors cursorType)
{
return null;
}
public override SynchronizationContext GetSynchronizationContext()
{
return new DesignSynchronizationContext { virtualPlatform = this };
}
public override PlatformHotkey Hotkey(KeyGesture keyGesture)
{
throw new NotImplementedException("不能在设计模式下调用");
}
internal ConcurrentQueue<SendOrPostData> asyncQueue = new ConcurrentQueue<SendOrPostData>();
internal ConcurrentQueue<SendOrPostData> invokeQueue = new ConcurrentQueue<SendOrPostData>();
ManualResetEvent messageInvoke = new ManualResetEvent(false);
public void Exit()
{
IsRun = false;
messageInvoke.Set();
}
bool IsRun = true;
public override void Run()
{
while (IsRun)
{
if (invokeQueue.Count == 0 && asyncQueue.Count == 0)
{
messageInvoke.WaitOne();
messageInvoke.Reset();
}
if (!IsRun)
{
return;
}
if (invokeQueue.TryDequeue(out SendOrPostData result))
{
try
{
result.SendOrPostCallback(result.Data);
}
catch (Exception e)
{
result.ManualResetEvent.Set();
throw new InvalidOperationException("Invoke操作异常", e);
}
finally
{
result.ManualResetEvent.Set();
}
}
while (asyncQueue.TryDequeue(out SendOrPostData data))
{
data.SendOrPostCallback(data.Data);
}
}
}
public void SendMessage()
{
messageInvoke.Set();
}
public override void Run(CancellationToken cancellation)
{
throw new NotImplementedException("不能在设计模式下调用");
}
public override Task<string[]> ShowFileDialogAsync(FileDialog dialog, IWindowImpl parent)
{
throw new NotImplementedException("不能在设计模式下调用");
}
public override Task<string> ShowFolderDialogAsync(OpenFolderDialog dialog, IWindowImpl parent)
{
throw new NotImplementedException("不能在设计模式下调用");
}
}
}