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);
    }
}

运行效果

相关推荐
寒水馨2 天前
macOS下载、安装godot-4.7.1-stable(附安装包Godot_v4.7.1-stable_macos.universal.zip)
macos·3d·游戏引擎·godot·跨平台·游戏开发·2d
寒水馨3 天前
Windows下载、安装electron-v43.2.0(附安装包electron-v43.2.0-win32-x64.zip)
javascript·windows·typescript·electron·跨平台·桌面应用·chromium
寒水馨3 天前
macOS下载、安装electron-v43.2.0(附安装包electron-v43.2.0-darwin-arm64.zip)
javascript·macos·electron·node.js·跨平台·桌面应用开发·开源框架
REDcker7 天前
SWIG Java胶水层开源项目学习路径
java·学习·开源·跨平台·jni·swig
消失的旧时光-194311 天前
KMP Web 开发实战(二):js、wasmJs、browser、executable 到底是什么意思?
开发语言·前端·javascript·跨平台·kmp
阿pin17 天前
Android随笔-MVC/MVP/MVVM/MVI
android·mvc·mvvm·mvp·mvi
丁小未17 天前
基于MVVM框架的XUUI 扩展的UI管理系统教程
unity·mvvm·ui框架·xuui·ui管理器
想你依然心痛23 天前
AtomCode 在 HarmonyOS 开发环境中的表现测评
跨平台·harmonyos·arkts·信创·国产系统
Peter(阿斯拉)1 个月前
[Android]_[中级]_[如何创建MVVM架构原型]
android·java·架构·mvvm·viewmodel
JohnnyDeng941 个月前
【Android】ViewModelScope 与协程生命周期管理:告别内存泄漏,掌控异步边界
android·kotlin·mvvm·协程