using Eto.Wpf.Forms.Cells; using Eto.Wpf.Forms.ToolBar; using Eto.Wpf.Drawing; using Eto.Wpf.Forms.Menu; using Eto.Wpf.Forms.Controls; using Eto.Wpf.Forms.Printing; using Eto.Wpf.Forms; using Eto.Forms.ThemedControls; using Eto.Shared.Forms; namespace Eto.Wpf { public class Platform : Eto.Platform { public override string ID => "Wpf"; public override bool IsDesktop { get { return true; } } public override bool IsWpf { get { return true; } } public override PlatformFeatures SupportedFeatures => PlatformFeatures.DrawableWithTransparentContent | PlatformFeatures.CustomCellSupportsControlView | PlatformFeatures.TabIndexWithCustomContainers | PlatformFeatures.MultiThreadedUI | PlatformFeatures.Mnemonics; static Platform() { EmbeddedAssemblyLoader.Register("Eto.Wpf.CustomControls.Assemblies"); Style.Add(null, h => { h.Widget.Items.CollectionChanged += (sender, e) => { var count = h.Widget.Items.Count; for (int i = 0; i < count; i++) { SegmentedItem item = h.Widget.Items[i]; if (item.ControlObject is Control control) { var native = control.ToNative(); if (native != null) { WpfProperties.SetEtoStyle(native, "SegmentedButton"); if (i == 0) { if (i == count - 1) WpfProperties.SetEtoModifier(native, "only"); else WpfProperties.SetEtoModifier(native, "first"); } else if (i == count - 1) WpfProperties.SetEtoModifier(native, "last"); else native.ClearValue(WpfProperties.EtoModifierProperty); } } } }; }); Style.Add(null, c => { c.Load += (sender, e) => { if (c.ControlObject is sw.Window window) { window.WindowStartupLocation = sw.WindowStartupLocation.CenterScreen; } }; }); } public Platform() { AddTo(this); // use WebView2 by default as it is more modern than IE UseWebView2(); } public static void AddTo(Eto.Platform p) { // Drawing p.Add(() => new BitmapHandler()); p.Add(() => new FontFamilyHandler()); p.Add(() => new FontTypefaceHandler()); p.Add(() => new FontHandler()); p.Add(() => new FontsHandler()); p.Add(() => new GraphicsHandler()); p.Add(() => new GraphicsPathHandler()); p.Add(() => new IconHandler()); p.Add(() => new IconFrameHandler()); p.Add(() => new IndexedBitmapHandler()); p.Add(() => new MatrixHandler()); p.Add(() => new PenHandler()); p.Add(() => new SolidBrushHandler()); p.Add(() => new TextureBrushHandler()); p.Add(() => new LinearGradientBrushHandler()); p.Add(() => new RadialGradientBrushHandler()); p.Add(() => new SystemColorsHandler()); p.Add(() => new FormattedTextHandler()); p.Add(() => new MagnificationGestureHandler()); p.Add(() => new RotationGestureHandler()); p.Add(() => new PanGestureHandler()); p.Add(() => new ScrollGestureHandler()); // Forms.Cells p.Add(() => new CheckBoxCellHandler()); p.Add(() => new ComboBoxCellHandler()); p.Add(() => new ImageTextCellHandler()); p.Add(() => new ImageViewCellHandler()); p.Add(() => new TextBoxCellHandler()); p.Add(() => new DrawableCellHandler()); p.Add(() => new ProgressCellHandler()); p.Add(() => new CustomCellHandler()); // Forms.Controls p.Add(() => new ButtonHandler()); p.Add(() => new CalendarHandler()); p.Add(() => new CheckBoxHandler()); p.Add(() => new DropDownHandler()); p.Add(() => new ComboBoxHandler()); p.Add(() => new ThemedColorPickerHandler()); p.Add(() => new DateTimePickerHandler()); p.Add(() => new DrawableHandler()); p.Add(() => new ExpanderHandler()); p.Add(() => new ThemedFontPickerHandler()); p.Add(() => new GridColumnHandler()); p.Add(() => new GridViewHandler()); p.Add(() => new GroupBoxHandler()); p.Add(() => new ImageViewHandler()); p.Add(() => new LabelHandler()); p.Add(() => new LinkButtonHandler()); p.Add(() => new ListBoxHandler()); // p.Add(() => new ThemedListBoxHandler()); p.Add(() => new ThemedNumericStepperHandler()); p.Add(() => new PanelHandler()); p.Add(() => new PasswordBoxHandler()); p.Add(() => new ProgressBarHandler()); p.Add(() => new RadioButtonHandler()); p.Add(() => new SearchBoxHandler()); p.Add(() => new ScrollableHandler()); p.Add(() => new SliderHandler()); p.Add(() => new ThemedSpinnerHandler()); p.Add(() => new SplitterHandler()); p.Add(() => new TabControlHandler()); p.Add(() => new TabPageHandler()); p.Add(() => new TextAreaHandler()); p.Add(() => new TextBoxHandler()); p.Add(() => new TreeGridViewHandler()); #pragma warning disable CS0618 // Type or member is obsolete p.Add(() => new ThemedTreeViewHandler()); #pragma warning restore CS0618 // Type or member is obsolete //p.Add(() => new WebViewHandler ()); p.Add(() => new RichTextAreaHandler()); p.Add(() => new StepperHandler()); p.Add(() => new TextStepperHandler()); p.Add(() => new ThemedFilePickerHandler()); p.Add(() => new ThemedDocumentControlHandler()); p.Add(() => new ThemedDocumentPageHandler()); p.Add(() => new ThemedSegmentedButtonHandler()); p.Add(() => new ThemedButtonSegmentedItemHandler()); p.Add(() => new ThemedMenuSegmentedItemHandler()); p.Add(() => new ToggleButtonHandler()); p.Add(() => new ThemedPropertyGridHandler()); p.Add(() => new ThemedCollectionEditorHandler()); p.Add(() => new NativeControlHandler()); // Forms.Menu p.Add(() => new CheckMenuItemHandler()); p.Add(() => new ContextMenuHandler()); p.Add(() => new ButtonMenuItemHandler()); p.Add(() => new MenuBarHandler()); p.Add(() => new RadioMenuItemHandler()); p.Add(() => new SeparatorMenuItemHandler()); p.Add(() => new SubMenuItemHandler()); // Forms.Printing p.Add(() => new PrintDialogHandler()); p.Add(() => new PrintPreviewDialogHandler()); p.Add(() => new PrintDocumentHandler()); p.Add(() => new PrintSettingsHandler()); // Forms.ToolBar p.Add(() => new CheckToolItemHandler()); p.Add(() => new RadioToolItemHandler()); p.Add(() => new SeparatorToolItemHandler()); p.Add(() => new ButtonToolItemHandler()); p.Add(() => new DropDownToolItemHandler()); p.Add(() => new ToolBarHandler()); // Forms p.Add(() => new ThemedAboutDialogHandler()); p.Add(() => new ApplicationHandler()); p.Add(() => new ClipboardHandler()); p.Add(() => new ThemedColorDialogHandler()); p.Add(() => new CursorHandler()); p.Add(() => new DialogHandler()); p.Add(() => new ThemedFontDialogHandler()); p.Add(() => new FormHandler()); p.Add(() => new FloatingFormHandler()); // p.Add(() => new MessageBoxHandler()); p.Add(() => new ThemedMessageBoxHandler()); p.Add(() => new OpenFileDialogHandler()); p.Add(() => new OpenWithDialogHandler()); p.Add(() => new PixelLayoutHandler()); p.Add(() => new SaveFileDialogHandler()); if (Microsoft.WindowsAPICodePack.Dialogs.CommonFileDialog.IsPlatformSupported) p.Add(() => new VistaSelectFolderDialogHandler()); else p.Add(() => new SelectFolderDialogHandler()); p.Add(() => new TableLayoutHandler()); p.Add(() => new UITimerHandler()); p.Add(() => new MouseHandler()); p.Add(() => new ScreensHandler()); p.Add(() => new KeyboardHandler()); p.Add(() => new FixedMaskedTextProviderHandler()); p.Add(() => new TrayIndicatorHandler()); p.Add(() => new NotificationHandler()); p.Add(() => new DataObjectHandler()); p.Add(() => new DataFormatsHandler()); p.Add(() => new TaskbarHandler()); p.Add(() => new WindowHandler()); p.Add(() => new ThemesHandler()); p.Add(() => throw new InvalidOperationException()); // IO p.Add(() => new SystemIconsHandler()); // General p.Add(() => new EtoEnvironmentHandler()); } public void UseWpfWebView() { Add(() => new WpfWebViewHandler()); } public void UseSwfWebView() { Add(() => new SwfWebViewHandler()); } public void UseWebView2() { Add(Create_WebView2); } private WebView.IHandler Create_WebView2() { try { return WebView2Loader.Create(); } catch { Trace.WriteLine("Warning: Could not create WebView2 handler. Add Microsoft.Web.WebView2 nuget package to your project to take advantage of the latest web control."); // switch to SWF version for subsequent controls UseSwfWebView(); return new SwfWebViewHandler(); } } } }