diff --git a/Exmaple2.0/App.axaml b/Exmaple2.0/App.axaml
index b8dbed0..5b7f261 100644
--- a/Exmaple2.0/App.axaml
+++ b/Exmaple2.0/App.axaml
@@ -11,4 +11,11 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Exmaple2.0/EmbeddedViewLocator.cs b/Exmaple2.0/EmbeddedViewLocator.cs
new file mode 100644
index 0000000..cb6e17a
--- /dev/null
+++ b/Exmaple2.0/EmbeddedViewLocator.cs
@@ -0,0 +1,40 @@
+using Avalonia.Controls;
+using Avalonia.Controls.Templates;
+
+namespace Exmaple2._0;
+
+public class EmbeddedViewLocator
+ : IDataTemplate
+{
+ public static Control BuildView(object? data)
+ {
+ if (data is not null)
+ {
+ var name = data.GetType().AssemblyQualifiedName!.Replace("ViewModel", "View");
+ var type = Type.GetType(name);
+
+ if (type != null)
+ {
+ return (Control)Activator.CreateInstance(type)!;
+ }
+ else
+ {
+ return new TextBlock { Text = "Not Found: " + name };
+ }
+ }
+ else
+ {
+ return new TextBlock { Text = "Data object is null" };
+ }
+ }
+
+ public Control Build(object? data)
+ {
+ return BuildView(data);
+ }
+
+ public bool Match(object? data)
+ {
+ return data is not null;
+ }
+}
diff --git a/Exmaple2.0/ViewModels/EmbeddedViewModel.cs b/Exmaple2.0/ViewModels/EmbeddedViewModel.cs
new file mode 100644
index 0000000..909f575
--- /dev/null
+++ b/Exmaple2.0/ViewModels/EmbeddedViewModel.cs
@@ -0,0 +1,6 @@
+namespace Exmaple2._0.ViewModels;
+
+public class EmbeddedViewModel : ViewModelBase
+{
+ public string Message => "This is an embedded message!";
+}
diff --git a/Exmaple2.0/Views/EmbeddedView.axaml b/Exmaple2.0/Views/EmbeddedView.axaml
new file mode 100644
index 0000000..4d0e202
--- /dev/null
+++ b/Exmaple2.0/Views/EmbeddedView.axaml
@@ -0,0 +1,23 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/Exmaple2.0/Views/EmbeddedView.axaml.cs b/Exmaple2.0/Views/EmbeddedView.axaml.cs
new file mode 100644
index 0000000..5f80cb5
--- /dev/null
+++ b/Exmaple2.0/Views/EmbeddedView.axaml.cs
@@ -0,0 +1,11 @@
+using Avalonia.Controls;
+
+namespace Exmaple2._0.Views;
+
+public partial class EmbeddedView : UserControl
+{
+ public EmbeddedView()
+ {
+ InitializeComponent();
+ }
+}
\ No newline at end of file
diff --git a/Exmaple2.0/Views/MainWindow.axaml b/Exmaple2.0/Views/MainWindow.axaml
index 2f1a228..737840b 100644
--- a/Exmaple2.0/Views/MainWindow.axaml
+++ b/Exmaple2.0/Views/MainWindow.axaml
@@ -26,6 +26,7 @@
+
diff --git a/Exmaple2.0/Views/MainWindow.axaml.cs b/Exmaple2.0/Views/MainWindow.axaml.cs
index d15a6be..abf210a 100644
--- a/Exmaple2.0/Views/MainWindow.axaml.cs
+++ b/Exmaple2.0/Views/MainWindow.axaml.cs
@@ -1,3 +1,4 @@
+using System;
using System.Diagnostics;
using System.Runtime.InteropServices;
@@ -5,10 +6,16 @@
using Avalonia.Controls;
using Avalonia.Interactivity;
+using Exmaple2._0.ViewModels;
+
using MsBox.Avalonia;
+using MsBox.Avalonia.Controls;
using MsBox.Avalonia.Dto;
using MsBox.Avalonia.Enums;
using MsBox.Avalonia.Models;
+using MsBox.Avalonia.ViewModels;
+
+using static System.Net.Mime.MediaTypeNames;
namespace Exmaple2._0.Views;
@@ -32,6 +39,18 @@ private async void Standard_Show_OnClick(object sender, RoutedEventArgs e)
var result = await box.ShowAsPopupAsync(this);
}
+ private async void Standard_Context_Show_OnClick(object sender, RoutedEventArgs e)
+ {
+ var box = MessageBoxManager
+ .GetMessageBoxStandard(
+ "Caption",
+ "Are you sure you would like to delete appender_replace_page_1?",
+ ButtonEnum.YesNo,
+ context: new EmbeddedViewModel());
+
+ var result = await box.ShowAsPopupAsync(this);
+ }
+
private async void Standard_Dialog_OnClick(object sender, RoutedEventArgs e)
{
int maxWidth = 500;
diff --git a/MsBox.Avalonia/Controls/MsBoxStandardView.axaml b/MsBox.Avalonia/Controls/MsBoxStandardView.axaml
index afb834a..7bb20dc 100644
--- a/MsBox.Avalonia/Controls/MsBoxStandardView.axaml
+++ b/MsBox.Avalonia/Controls/MsBoxStandardView.axaml
@@ -10,6 +10,7 @@
d:DataContext="{x:Static viewModels:DesignDataContexts.StandardInputViewModel}"
x:Class="MsBox.Avalonia.Controls.MsBoxStandardView" MinWidth="{Binding MinWidth}"
x:DataType="viewModels:MsBoxStandardViewModel"
+ xmlns:local="clr-namespace:MsBox.Avalonia"
MaxWidth="{Binding MaxWidth}"
Width="{Binding Width}"
MinHeight="{Binding MinHeight}"
@@ -24,23 +25,23 @@
-
-
-
+
+
@@ -95,6 +96,7 @@
+
@@ -105,22 +107,29 @@
Text="{Binding ContentMessage}" IsVisible="{Binding !Markdown}" />
+ IsVisible="{Binding Markdown}" />
+
+
+
+
-
+
-
-
-
-
-
-
+
+
+
+
+
+
, IS
public MsBoxStandardView()
{
InitializeComponent();
+
+ if (Application.Current.TryGetResource("EmbeddedMessageBoxViewLocator", out object? embeddedViewLocator))
+ {
+ var viewLocator = embeddedViewLocator as IDataTemplate;
+ if (viewLocator is not null)
+ {
+ embeddedView.DataTemplates.Add(viewLocator);
+ }
+ }
}
public void SetButtonResult(ButtonResult bdName)
diff --git a/MsBox.Avalonia/Dto/MessageBoxStandardParams.cs b/MsBox.Avalonia/Dto/MessageBoxStandardParams.cs
index 7429578..836bb18 100644
--- a/MsBox.Avalonia/Dto/MessageBoxStandardParams.cs
+++ b/MsBox.Avalonia/Dto/MessageBoxStandardParams.cs
@@ -9,6 +9,11 @@ public class MessageBoxStandardParams : AbstractMessageBoxParams
///
public Icon Icon { get; set; } = Icon.None;
+ ///
+ /// View model for embedded context.
+ ///
+ public object? Context { get; set; } = null;
+
///
/// Default buttons
///
diff --git a/MsBox.Avalonia/MessageBoxManager.cs b/MsBox.Avalonia/MessageBoxManager.cs
index d2b8de0..69738ec 100644
--- a/MsBox.Avalonia/MessageBoxManager.cs
+++ b/MsBox.Avalonia/MessageBoxManager.cs
@@ -38,6 +38,7 @@ public static IMsBox GetMessageBoxStandard(MessageBoxStandardParam
/// Text of messagebox body
/// Buttons of messagebox (default OK)
/// Icon of messagebox (default no icon)
+ /// Embedded view model in messagebox (default null)
/// Startup location of messagebox (default center screen)
///
///
@@ -45,7 +46,7 @@ public static IMsBox GetMessageBoxStandard(MessageBoxStandardParam
/// Recommended method for message box
///
public static IMsBox GetMessageBoxStandard(string title, string text,
- ButtonEnum @enum = ButtonEnum.Ok, Icon icon = Icon.None,
+ ButtonEnum @enum = ButtonEnum.Ok, Icon icon = Icon.None, object? context = null,
WindowStartupLocation windowStartupLocation = WindowStartupLocation.CenterScreen) =>
GetMessageBoxStandard(new MessageBoxStandardParams
{
@@ -53,6 +54,7 @@ public static IMsBox GetMessageBoxStandard(string title, string te
ContentMessage = text,
ButtonDefinitions = @enum,
Icon = icon,
+ Context = context,
WindowStartupLocation = windowStartupLocation
});
}
\ No newline at end of file
diff --git a/MsBox.Avalonia/ViewModels/MsBoxStandardViewModel.cs b/MsBox.Avalonia/ViewModels/MsBoxStandardViewModel.cs
index 71580e1..c027b10 100644
--- a/MsBox.Avalonia/ViewModels/MsBoxStandardViewModel.cs
+++ b/MsBox.Avalonia/ViewModels/MsBoxStandardViewModel.cs
@@ -19,6 +19,12 @@ public MsBoxStandardViewModel(MessageBoxStandardParams @params) :
_enterDefaultButton = @params.EnterDefaultButton;
_escDefaultButton = @params.EscDefaultButton;
+ Context = @params.Context;
+ if (Context is not null)
+ {
+ IsContextVisible = true;
+ }
+
SetButtons(@params.ButtonDefinitions);
ButtonClickCommand = new RelayCommand(o => ButtonClick(o.ToString()));
EnterClickCommand = new RelayCommand(_ => EnterClick());
@@ -48,6 +54,9 @@ public void SetFullApi(IFullApi fullApi)
public override string InputValue { get; set; }
public override bool IsInputMultiline { get; internal set; }
public override bool IsInputVisible { get; internal set; }
+ public virtual object? Context { get; internal set; } = null;
+ public virtual bool IsContextVisible { get; internal set; } = false;
+
#endregion
public RelayCommand ButtonClickCommand { get; }