C# Avalonia动态加载xaml和cs实例

扩展请参考

https://www.cnblogs.com/dalgleish/p/18972924 

NonCompiledXaml.axaml代码

<Window xmlns="https://github.com/avaloniaui"         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"         xmlns:d="http://schemas.microsoft.com/expression/blend/2008"         xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"         mc:Ignorable="d" d:DesignWidth="800" d:DesignHeight="450"         x:Class="AvaloniaUI.NonCompiledXaml"         Title="NonCompiledXaml">     <ScrollViewer>         <StackPanel Name="mainPanel" Background="#f0f0f0">             <TextBlock Text="&#xe6e5;" FontFamily="{StaticResource IconFont}" FontSize="20" Margin="5" HorizontalAlignment="Center"/>             <Button Content="加载动态内容" Click="Button_Click" Margin="0,0,0,5"/>         </StackPanel>     </ScrollViewer> </Window>

NonCompiledXaml.axaml.cs代码,其中Window1是一个简单的Window窗口。新扩展已经支持多个cs文件编译,并且支持AvaloniaUseCompiledBindingsByDefault = true

using Avalonia; using Avalonia.Controls; using Avalonia.Interactivity; using Avalonia.Platform; using Shares.Avalonia; using System; using System.IO; using System.Text; using System.Threading.Tasks;  namespace AvaloniaUI;  public partial class NonCompiledXaml : Window {     public NonCompiledXaml()     {         InitializeComponent();     }     private async void Button_Click(object? sender, RoutedEventArgs e)     {         Control control =  await this.RunResourceAsync("Window1");         mainPanel.Children.Add(control);         var xaml = @" <UserControl xmlns='https://github.com/avaloniaui'              xmlns:x='http://schemas.microsoft.com/winfx/2006/xaml'              x:Class='SampleView'>     <StackPanel Margin='20'>         <TextBlock Text='{Binding Message}' FontSize='24' Foreground='Blue'/>     </StackPanel> </UserControl> ";          var code = @" using Avalonia.Controls; using CommunityToolkit.Mvvm.ComponentModel; using CommunityToolkit.Mvvm.Input;  public class SampleView : UserControl {     public SampleView()     {         this.DataContext = new ViewModel();     }      public class ViewModel : ObservableObject     {          private string message = ""Hello from dynamic SampleView!"";          public string Message         {             get => message;             set => SetProperty(ref message, value);         }     } } ";         Control xamlControl = await this.RunXamlAsync(xaml, code);         mainPanel.Children.Add(xamlControl);          var xaml1 = @"<Window xmlns=""https://github.com/avaloniaui""         xmlns:x=""http://schemas.microsoft.com/winfx/2006/xaml""         xmlns:d=""http://schemas.microsoft.com/expression/blend/2008""         xmlns:mc=""http://schemas.openxmlformats.org/markup-compatibility/2006"" 		 xmlns:local=""using:AvaloniaUI""         mc:Ignorable=""d"" d:DesignWidth=""800"" d:DesignHeight=""450""         x:Class=""AvaloniaUI.Window2""         Title=""Window2""> 	<StackPanel Margin=""20""> 		<TextBlock x:DataType=""local:ViewModel"" Text=""{Binding Message}"" FontSize=""24"" Foreground=""Blue""/> 	</StackPanel> </Window>  ";         var code1 = @"using Avalonia; using Avalonia.Controls; using CommunityToolkit.Mvvm.ComponentModel;  namespace AvaloniaUI;  public partial class Window2 : Window {     public Window2()     {         this.DataContext = new ViewModel();     } } public class ViewModel : ObservableObject     {         private string message = ""Hello from dynamic Window2View!"";          public string Message         {             get => message;             set => SetProperty(ref message, value);         }     } ";         Control xamlControl1 = await this.RunXamlAsync(xaml1, code1,"Window2");         mainPanel.Children.Add(xamlControl1);     } } 

运行效果

C# Avalonia动态加载xaml和cs实例

 

发表评论

评论已关闭。

相关文章