辗振 发表于 2025-7-9 12:18:44

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

扩展请参考
https://www.cnblogs.com/dalgleish/p/18972924NonCompiledXaml.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="" 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: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);
    }
}运行效果

 

来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
页: [1]
查看完整版本: C# Avalonia动态加载xaml和cs实例