Major milestone adding full control functionality: Controls Enhanced: - Entry/Editor: Full keyboard input, cursor navigation, selection, clipboard - CollectionView: Data binding, selection highlighting, scrolling - CheckBox/Switch/Slider: Interactive state management - Picker/DatePicker/TimePicker: Dropdown selection with popup overlays - ProgressBar/ActivityIndicator: Animated progress display - Button: Press/release visual states - Border/Frame: Rounded corners, stroke styling - Label: Text wrapping, alignment, decorations - Grid/StackLayout: Margin and padding support Features Added: - DisplayAlert dialogs with button actions - NavigationPage with toolbar and back navigation - Shell with flyout menu navigation - XAML value converters for data binding - Margin support in all layout containers - Popup overlay system for pickers New Samples: - TodoApp: Full CRUD task manager with NavigationPage - ShellDemo: Comprehensive control showcase Removed: - ControlGallery (replaced by ShellDemo) - LinuxDemo (replaced by TodoApp) 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
68 lines
2.7 KiB
C#
68 lines
2.7 KiB
C#
// Program.cs - Linux platform entry point
|
|
|
|
using Microsoft.Maui.Platform.Linux;
|
|
|
|
namespace TodoApp;
|
|
|
|
class Program
|
|
{
|
|
static void Main(string[] args)
|
|
{
|
|
// Redirect console output to a log file for debugging
|
|
var logPath = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.UserProfile), "todoapp.log");
|
|
using var logWriter = new StreamWriter(logPath, append: false) { AutoFlush = true };
|
|
var multiWriter = new MultiTextWriter(Console.Out, logWriter);
|
|
Console.SetOut(multiWriter);
|
|
Console.SetError(multiWriter);
|
|
|
|
// Global exception handler
|
|
AppDomain.CurrentDomain.UnhandledException += (sender, e) =>
|
|
{
|
|
var ex = e.ExceptionObject as Exception;
|
|
Console.WriteLine($"[FATAL] Unhandled exception: {ex?.GetType().Name}: {ex?.Message}");
|
|
Console.WriteLine($"[FATAL] Stack trace: {ex?.StackTrace}");
|
|
if (ex?.InnerException != null)
|
|
{
|
|
Console.WriteLine($"[FATAL] Inner exception: {ex.InnerException.GetType().Name}: {ex.InnerException.Message}");
|
|
Console.WriteLine($"[FATAL] Inner stack trace: {ex.InnerException.StackTrace}");
|
|
}
|
|
};
|
|
|
|
TaskScheduler.UnobservedTaskException += (sender, e) =>
|
|
{
|
|
Console.WriteLine($"[FATAL] Unobserved task exception: {e.Exception?.GetType().Name}: {e.Exception?.Message}");
|
|
Console.WriteLine($"[FATAL] Stack trace: {e.Exception?.StackTrace}");
|
|
e.SetObserved(); // Prevent crash
|
|
};
|
|
|
|
Console.WriteLine($"[Program] Starting TodoApp at {DateTime.Now}");
|
|
Console.WriteLine($"[Program] Log file: {logPath}");
|
|
|
|
try
|
|
{
|
|
// Create the MAUI app with all handlers registered
|
|
var app = MauiProgram.CreateMauiApp();
|
|
|
|
// Run on Linux platform
|
|
LinuxApplication.Run(app, args);
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
Console.WriteLine($"[FATAL] Exception in Main: {ex.GetType().Name}: {ex.Message}");
|
|
Console.WriteLine($"[FATAL] Stack trace: {ex.StackTrace}");
|
|
throw;
|
|
}
|
|
}
|
|
}
|
|
|
|
// Helper to write to both console and file
|
|
class MultiTextWriter : TextWriter
|
|
{
|
|
private readonly TextWriter[] _writers;
|
|
public MultiTextWriter(params TextWriter[] writers) => _writers = writers;
|
|
public override System.Text.Encoding Encoding => System.Text.Encoding.UTF8;
|
|
public override void Write(char value) { foreach (var w in _writers) w.Write(value); }
|
|
public override void WriteLine(string? value) { foreach (var w in _writers) w.WriteLine(value); }
|
|
public override void Flush() { foreach (var w in _writers) w.Flush(); }
|
|
}
|