using System; using System.Net; using Avalonia; using Avalonia.Controls; using Avalonia.Controls.Remote; using Avalonia.Markup.Xaml; using Avalonia.Remote.Protocol; using Avalonia.Remote.Protocol.Designer; using Avalonia.Remote.Protocol.Viewport; using Avalonia.Threading; namespace Previewer { public class MainWindow : Window { private const string InitialXaml = @" Hello world! "; private IAvaloniaRemoteTransportConnection _connection; private Control _errorsContainer; private TextBlock _errors; private RemoteWidget _remote; public MainWindow() { this.InitializeComponent(); var tb = this.FindControl("Xaml"); tb.Text = InitialXaml; var scroll = this.FindControl("Remote"); var rem = new Center(); scroll.Content = rem; _errorsContainer = this.FindControl("ErrorsContainer"); _errors = this.FindControl("Errors"); tb.GetObservable(TextBox.TextProperty).Subscribe(text => _connection?.Send(new UpdateXamlMessage { Xaml = text })); new BsonTcpTransport().Listen(IPAddress.Loopback, 25000, t => { Dispatcher.UIThread.Post(() => { if (_connection != null) { _connection.Dispose(); _connection.OnMessage -= OnMessage; } _connection = t; rem.Child = _remote = new RemoteWidget(t); t.Send(new UpdateXamlMessage { Xaml = tb.Text }); t.OnMessage += OnMessage; }); }); Title = "Listening on 127.0.0.1:25000"; } private void OnMessage(IAvaloniaRemoteTransportConnection transport, object obj) { Dispatcher.UIThread.Post(() => { if (transport != _connection) return; if (obj is UpdateXamlResultMessage result) { _errorsContainer.IsVisible = result.Error != null; _errors.Text = result.Error ?? ""; } if (obj is RequestViewportResizeMessage resize) { _remote.Width = Math.Min(4096, Math.Max(resize.Width, 1)); _remote.Height = Math.Min(4096, Math.Max(resize.Height, 1)); } }); } private void InitializeComponent() { AvaloniaXamlLoader.Load(this); } } }