我对 Avalonia/WPF、Xaml 和桌面开发总体来说是新手,所以请原谅并澄清我所展示的任何相关误解。我将继续研究可用的文档,但我很难找到能够解决我所困扰的问题的材料。
我正在尝试使用推荐的 MVVM 模式和关联的 Avalonia 项目模板,在我的 Avalonia 应用程序中实现基于组合根、构造函数注入的依赖注入系统。我对 Microsoft.Extensions.DependencyInjection 包有一定的熟悉,因此一直在尝试使用该系统。
在基于此 DI 框架以及其他框架的 WPF 和 Avalonia 教程之间,我尝试拼凑出一个可行的解决方案。我认为我已经在概念上弄清楚了注册服务和视图模型并适当地为这些类设置构造函数,以便框架在实例化时将依赖项注入到这些类中。然而,我遇到的问题是如何实现 View 类的构造函数注入。
我尝试将 MainWindow 和 MainWindowViewModel 注册为服务:
// App.axaml.cs
public partial class App : Application
{
private IServiceProvider _services;
public override void Initialize()
{
AvaloniaXamlLoader.Load(this);
}
public override void OnFrameworkInitializationCompleted()
{
ConfigureServiceProvider();
if (ApplicationLifetime is IClassicDesktopStyleApplicationLifetime desktop)
{
desktop.MainWindow = _services.GetService<MainWindow>();
}
base.OnFrameworkInitializationCompleted();
}
private void ConfigureServiceProvider()
{
var services = ConfigureServices();
_services = services.BuildServiceProvider();
}
private static IServiceCollection ConfigureServices()
{ …
Run Code Online (Sandbox Code Playgroud) .Net Conf 目前正在进行中,我了解到了名为 Avalonia UI 的东西。(我使用 .NET MAUI)经过一些研究,Avalonia UI 主要是一个桌面 UI 框架,现在支持 Android 和 iOS。
既然它们都是 dotNet 基础项目,为什么它们要开发两个不同的多平台框架?由于它们都使用 XAML 和 C# 代码,因此两者相比是否有明显的优势?
我正在使用OpenFileDialog
,SaveFileDialog
并OpenFolderDialog
在 Avalonia 应用程序中工作。
一个要求是将标题设置为特定字符串。
我实现了这一点OpenFileDialog
,SaveFileDialog
但不是为了OpenFolderDialog
。
OpenFolderDialog
拒绝应用标题,因此仅保留根据操作系统语言设置的默认标题。
我发现在ControlCatalogStandalone中工作OpenFolderDialog
正常,即标题可以根据需要设置。
因此,我尝试将ControlCatalogStandalone简化为对话框功能,并将其转换为与我的测试应用程序尽可能相似。
我无法实现这一点,但我发现了一些线索,可以帮助技术更熟练的开发人员找到我的测试应用程序行为不当的原因。ControlCatalogStandalone的解决方案
和项目的结构和组成与我的 Avalonia 测试应用程序有很大不同。
在我的测试应用程序中,目标框架是. 在ControlCatalogStandalone解决方案
的一个项目中,目标框架是.
所以,我认为在 中工作正确,但在.
我还认为,如果ControlCatalogStandalone是使用当前版本的扩展从头开始构建的,它不会产生框架的混合。
以下是我的测试应用程序的相关代码部分:
MainWindow.axaml:.NET Core 3.1
.NET Standard 2.0
OpenFolderDialog
.NET Standard
.NET Core
Avalonia for Visual Studio
<Window xmlns="https://github.com/avaloniaui"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:vm="clr-namespace:DialogTests.ViewModels;assembly=DialogTests"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable="d" Width="200" Height="150"
x:Class="DialogTests.Views.MainWindow"
Icon="/Assets/avalonia-logo.ico"
Title="DialogTests">
<Design.DataContext>
<vm:MainWindowViewModel/> …
Run Code Online (Sandbox Code Playgroud) 我正在考虑将我在 WPF 中制作的应用程序移植到 Avalonia。
我的第一个要求是启用点击透明度(与<Window Background="{x:Null}" WindowStyle="None" AllowsTransparency="True"
WPF 中相同)。
我已经尝试过了,但它看起来不起作用(至少在 Windows 上)。
ExtendClientAreaToDecorationsHint="True"
ExtendClientAreaChromeHints="NoChrome"
ExtendClientAreaTitleBarHeightHint="-1"
TransparencyBackgroundFallback="Transparent"
Background="{x:Null}"
Run Code Online (Sandbox Code Playgroud)
目标操作系统将是 Windows、macOS 和 Linux。因此,在将其安装在虚拟机中或购买新设备之前,我需要知道是否可以在所有操作系统中都具有该功能。
我需要创建一个简单的应用程序来将图形网络绘制到画布上。当我使用 .net core 时,最好的解决方案之一似乎是 Avalonia + Skia 后端。问题是我还没有找到任何好的文档或示例来说明它。
如何使用 Avalonia 和 Skia 渲染后端渲染一组 primites?
我正在尝试弄清楚如何在 Avalonia 中制作动画。
我有一条包含 4 条线段的路径,我想将每个点设置为新位置的动画。在 WPF 中我是这样做的:
public void AnimatePoints(PointCollection pts, TimeSpan timespan, bool randomized = true, Action onFinished = null)
{
Points = PointCollection.Parse(PathString);
//PathFigure needs an animation too (for the start point), otherwise the first point always stays in one place
var pfa = new PointAnimation(pts[0], timespan);
if (onFinished != null)
{
pfa.Completed += (sender, args) => onFinished();
}
PathFigure.BeginAnimation(PathFigure.StartPointProperty, pfa);
for (int i = 0; i < pts.Count; i++)
{
var pa = new PointAnimation(pts[i], timespan); …
Run Code Online (Sandbox Code Playgroud) 如何在TreeView控件中实现拖放行为?一个例子是文件资源管理器,用户可以通过拖动将文件从一个文件夹移动到另一个文件夹。
我的 XAML 中有以下代码:
<TreeView Items="{Binding RootFiles}">
<TreeView.ItemTemplate>
<TreeDataTemplate ItemsSource="{Binding Files}">
<TextBlock Text="{Binding Name}"/>
</TreeDataTemplate>
</TreeView.ItemTemplate>
</TreeView>
Run Code Online (Sandbox Code Playgroud)
如何使节点可拖动?
在 GDI+ 中,可以直接在画布上绘制(创建内存中位图并在那里执行任何需要执行的操作)。
我需要为 Avalonia 提供相同的“自定义控件”,并且我被告知这是可能的,因为可以访问SkiaSharp.Canvas
. 任何人都可以提供一些关于如何执行此操作的线索吗?
一个例子是连续变化的曲线,例如语音频率。如果您不直接在画布(或 Xaml 世界中命名的任何名称)上执行此操作,则速度太慢并且占用太多资源,尤其是当您在一个屏幕上需要 10 到 20 个资源时。
我有 GDI+、JavaFX、QML 背景,但对 Xaml 领域还很陌生。我已阅读完整的 Avalonia 文档,但没有任何相关内容。据我所知,阿瓦隆尼亚项目现阶段还有其他优先事项。
I'm trying out styles in avalonia and most works, except for pseudoclasses, they just get ignored.
I have created a window and all styles are in there and I have created a user control (with a button on - the pseudoclasses are on the button), using the styles. I do not use code, only xaml to define the styles.
I have tried it out in the "Style Selector" for the button as "Button:pseudoclassname" and "Button.le:pseudoclassname". I have also tried "Button:pointerover" …
我正在寻找正确的方法来声明 Avalonia 窗口的设计时 ViewModel。
一些样本表明
d:DataContext="{d:DesignInstance viewModels:LoginViewModel, IsDesignTimeCreatable=True}"
Run Code Online (Sandbox Code Playgroud)
这会抛出
XamlParseException at 5:5: Unable to resolve type DesignInstance from namespace http://schemas.microsoft.com/expression/blend/2008
Run Code Online (Sandbox Code Playgroud)
默认 Avalonia MVVM 模板建议
<Design.DataContext>
<vm:MainWindowViewModel/>
</Design.DataContext>
Run Code Online (Sandbox Code Playgroud)
如果 ViewModel 接受参数,它会抛出
XamlLoadException at 16:10: Unable to find public constructor for type Demo.CloseNonModalDialog:Demo.CloseNonModalDialog.CurrentTimeDialogViewModel()
Run Code Online (Sandbox Code Playgroud)
我想添加默认的无参数构造函数是一种选择。
使用 MvvmLight/WPF,我曾经将 ViewLocator 作为静态资源引用
DataContext="{Binding Source={StaticResource Locator}, Path=MainWindow}"
Run Code Online (Sandbox Code Playgroud)
这是一个选项,尽管我还没有找到声明和引用资源的正确方法。
这里推荐的方法是什么?如果我想显示设计时数据,我会说只有第三个选项才有效。这不是示例中显示的选项。