tune.
This commit is contained in:
@@ -0,0 +1,83 @@
|
||||
using Google.Protobuf.WellKnownTypes;
|
||||
using Hi.Disp;
|
||||
using Hi.Geom;
|
||||
using Hi.Licenses;
|
||||
using System.Collections.Concurrent;
|
||||
using System.Windows;
|
||||
|
||||
namespace Hi.WpfPlus.Disp;
|
||||
|
||||
/// <summary>
|
||||
/// Registers WPF as the display framework for <see cref="DispFrameUtil"/>,
|
||||
/// supporting multiple windows identified by key.
|
||||
/// </summary>
|
||||
/// <remarks>
|
||||
/// <para>
|
||||
/// Usage pattern: call <see cref="DispFrameUtil.Call"/> to queue display content,
|
||||
/// then call <see cref="Run"/> to start the WPF application and show windows.
|
||||
/// </para>
|
||||
/// <para>
|
||||
/// Each unique key creates a separate <see cref="RenderingWindow"/>.
|
||||
/// Calling <see cref="DispFrameUtil.Call"/> with the same key updates the existing window.
|
||||
/// </para>
|
||||
/// <example>
|
||||
/// <code>
|
||||
/// // Queue display content (before or after Run)
|
||||
/// DispFrameUtil.CallDispFrame("Window1", displayee1);
|
||||
/// DispFrameUtil.CallDispFrame("Window2", displayee2);
|
||||
/// // Start the WPF application (blocks until all windows are closed)
|
||||
/// DispFrameWpf.Run();
|
||||
/// </code>
|
||||
/// </example>
|
||||
/// </remarks>
|
||||
public static class WpfDispUtil
|
||||
{
|
||||
static readonly ConcurrentDictionary<string, RenderingWindow> KeyToWindowDictionary = new();
|
||||
|
||||
static WpfDispUtil()
|
||||
{
|
||||
DispFrameUtil.UpdateByDispEngineConfigFunc = ApplyConfig;
|
||||
}
|
||||
public static void Init() {
|
||||
DispEngine.Init();
|
||||
}
|
||||
|
||||
static void ApplyConfig(string key, DispEngineConfig config)
|
||||
{
|
||||
if (!KeyToWindowDictionary.TryGetValue(key, out var window))
|
||||
{
|
||||
window = new RenderingWindow() { Title = key };
|
||||
window.Closed += (s, e) => KeyToWindowDictionary.TryRemove(key, out _);
|
||||
KeyToWindowDictionary[key] = window;
|
||||
window.Show();
|
||||
}
|
||||
|
||||
var dispEngine = window.GetDispEngine();
|
||||
if (config.Displayee != null)
|
||||
dispEngine.Displayee = config.Displayee;
|
||||
if (config.SketchView == null)
|
||||
config.SketchView = config.Displayee?.GetBox3d()?.FrontView;
|
||||
if (config.SketchView != null)
|
||||
dispEngine.SketchView = config.SketchView;
|
||||
}
|
||||
public static DispEngineConfig Call(
|
||||
string title, params IDisplayee[] displayees)=>
|
||||
DispFrameUtil.Call(title, displayees);
|
||||
public static void RunApplication(string title, params IDisplayee[] displayees)
|
||||
{
|
||||
DispFrameUtil.Call(title, displayees);
|
||||
RunApplication();
|
||||
}
|
||||
public static void RunApplication()
|
||||
{
|
||||
Application app = new Application()
|
||||
{
|
||||
ShutdownMode = ShutdownMode.OnLastWindowClose
|
||||
};
|
||||
//app.Exit += (o, e) =>
|
||||
//{
|
||||
// License.LogOutAll();
|
||||
//};
|
||||
app.Run();
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user