MAUI 的依赖注入设置类似于 ASP.NET Core 在 Startup.cs 类中的设置。默认情况下,此设置在MauiProgram.cs文件中。
我的问题是:服务注册后如何获取此文件中的服务实例?我想,一种解决方案如下,但是如果这些服务的构造函数在一段时间内发生变化,我也必须编辑此代码:
var keyValueStore = new PreferencesKeyValueStore();
var accountService = new AccountService(keyValueStore);
var profileService = new ProfileService(keyValueStore);
builder.Services.AddSingleton<IKeyValueStore>(keyValueStore);
builder.Services.AddSingleton<IAccountService>(accountService);
builder.Services.AddSingleton<IProfileService>(profileService);
//Here now I can use accountService and profileService to do something
Run Code Online (Sandbox Code Playgroud)
我找不到更优雅的解决方案来从 DI 容器返回服务实例。就像是:
builder.Services.AddSingleton<IKeyValueStore, PreferencesKeyValueStore>();
builder.Services.AddSingleton<IAccountService, AccountService>;
builder.Services.AddSingleton<IProfileService, ProfileService>();
//Now I can't perform something like: var accountService = diContainer.GetInstance<IAccountService>(); or similar.
Run Code Online (Sandbox Code Playgroud)
我不知道如何访问 di 容器并要求它向我提供注册实例。
我在 Xamarin.Forms 中经常使用Factor ofrelativeLayout ,这样我的应用程序 UI就可以在任何设备上正确缩放。不再建议使用RelativeLayout,并且不提供替代品,所以我想知道什么技术可以表明例如我希望xaml元素占据其父元素(容器)的80%?我应该根据设备分辨率在运行时计算容器的实际宽度/高度吗?或者有更好的解决方案?我在 .Net Maui 中找不到任何与relativelayout+factor允许我在Xamarin.Forms中做的事情相近的东西。
我一直致力于将我们的应用程序从 Xamarin.Forms 迁移到 .NET MAUI。我们的应用程序几乎没有绘图功能,用户可以用手指进行绘图。我们在 Xamarin.Forms 中使用TouchTrackingnuget 包,但它与 .NET MAUI 不兼容。
以下是TouchTracking我们经常使用的软件包中的一些 API:
绘制页面.xaml
<Grid BackgroundColor="White">
<skia:SKCanvasView x:Name="canvasView" PaintSurface="PaintingCanvasEnvent" />
<Grid.Effects>
<tt1:TouchEffect Capture="True" TouchAction="OnTouchEffectAction"/>
</Grid.Effects>
</Grid>
Run Code Online (Sandbox Code Playgroud)
DrawPage.cs
void OnTouchEffectAction(object sender, TouchActionEventArgs args)
{
SKPoint current = args.Location;
switch (args.Type)
{
case TouchActionType.Pressed:
//codes here ...
break;
case TouchActionType.Moved:
//codes here
break;
case TouchActionType.Released:
//codes here
break;
case TouchActionType.Cancelled:
//codes here
break;
}
}
Run Code Online (Sandbox Code Playgroud)
在Xamarin.Forms中,该TouchTracking包允许我们检测触摸事件,并且我们可以获得所有触摸ID(因为TouchTracking可以检测多个手指)及其坐标。
那么我如何实现TouchTrackingnuget包或某种可以实现上述要求的代码呢?
我是移动开发新手,正在编写 .NET MAUI Android 应用程序,该应用程序的一部分需要能够同步文件。该设备没有网络连接,将对接(连接到 PC),从 PC 获取在设备上创建的文件,然后 PC 会将新文件加载到设备。此同步过程将通过单独的桌面应用程序进行。
查看有关文件系统助手的文档,我没有看到明确记录的方法来将文件写入连接设备时在文件资源管理器中可见的目录。
我正在寻找一种写入目录的方法,该目录一旦停靠就可见。我不想打开一个对话框让用户选择保存位置,因为我希望该位置始终保持一致。关于在哪里可以获取“公共”文件夹的文件路径来读取和写入文件的任何想法?
我正在编写一个 .NET MAUI 应用程序,我想在我的 ViewModel 中使用Microsoft.Maui.Storage.Preferences,但是不希望将我的 ViewModel 绑定到静态Preferences类,否则将很难测试。所以我注意到有一个IPreferences接口,但我不知道它的目的是什么,因为我无法注入静态实现(并且首选项是静态的)。
在我的启动课程中,我做了通常的builder.Services.AddSingleton()事情.AddTransient():
builder.Services
.AddSingleton<AppShell>()
.AddTransient<MyViewModel>()
...
Run Code Online (Sandbox Code Playgroud)
但我不能用静态类来做到这一点。这是行不通的,因为你不能使用静态类作为类型参数:
.AddSingleton<IPreferences, Preferences>()
Run Code Online (Sandbox Code Playgroud)
这不起作用,因为框架不提供它:
.AddSingleton<IPreferences>()
Run Code Online (Sandbox Code Playgroud)
我试着变得更奇特:
.AddSingleton<IPreferences>(_ => Preferences.Default)
Run Code Online (Sandbox Code Playgroud)
但我在使用它时收到此错误:
_preferences.Get("SomeKey", DateTime.Now); // error here, but _preferences is defined
Run Code Online (Sandbox Code Playgroud)
[mono-rt] [ERROR] FATAL UNHANDLED EXCEPTION: System.NullReferenceException: Object reference not set to an instance of an object.
[mono-rt] at Microsoft.Maui.Storage.PreferencesImplementation.Get[DateTime](String key, DateTime defaultValue, String sharedName) in D:\a\_work\1\s\src\Essentials\src\Preferences\Preferences.android.cs:line 141
[mono-rt] at ... my filenames removed ... in ...\Shells\AppShell.xaml.cs:line 51
[mono-rt] …Run Code Online (Sandbox Code Playgroud) 我正在使用 .NET MAUI 创建桌面应用程序。
在这里,我有一个ContentPage标题为My title 的标题。
<ContentPage
x:Class="MAUI.Desktop.Pages.PlanningPage"
xmlns="http://schemas.microsoft.com/dotnet/2021/maui"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
Title="My title">
....
Run Code Online (Sandbox Code Playgroud)
它的标题默认左对齐,你知道如何将其对齐到页面中心吗?如果可以的话,我也想给它添加更多的风格。

编辑:建议的解决方案
NavigationPage。所以,这是我的解决方案:<ContentPage
x:Class="MAUI.Desktop.Pages.PlanningPage"
xmlns="http://schemas.microsoft.com/dotnet/2021/maui"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
>
<NavigationPage.TitleView>
<Label
x:Name="pageTitleView"
HorizontalTextAlignment="Center"
Text="My title"/>
</NavigationPage.TitleView>
......
Run Code Online (Sandbox Code Playgroud)
在代码隐藏xaml.cs文件中:
protected override void OnSizeAllocated(double width, double height)
{
base.OnSizeAllocated(width, height);
pageTitleView.WidthRequest = width;
}
Run Code Online (Sandbox Code Playgroud)
Shell app,您可以遵循@mm8 的答案更改项目文件中的应用程序图标 SVG 文件
从设备中删除应用程序
删除 /obj 和 /debug 中的所有内容
重建项目并将其部署到 ios 设备仍然是应用程序模板中的相同图标(蓝色,.net 标签)
使用 Visual Studio 2022 for OsX 并将其部署到模拟器,一切都按预期进行。
有人在 Visual Studio 2022 / Windows 10 下解决此问题吗?
<!-- App Icon -->
<MauiIcon Include="Resources\AppIcon\appicon.svg" ForegroundFile="Resources\AppIcon\appiconfg.svg" />
Run Code Online (Sandbox Code Playgroud) 我希望在 .NET MAUI 上设置 iOS 的状态栏颜色。我尝试了社区工具包(当前的错误,Android的发布版本在启动时崩溃),背景颜色和背景(iOS在启动时不尊重两者),并自己将颜色设置在我在状态栏后面绘制的形状上,并且效果不太好,对设备方向有点挑剔。我尝试过谷歌搜索,但没有找到太多关于如何使用 UIKit 设置颜色的信息。任何帮助深表感谢。
我正在尝试将 ListView 的 ItemSelected 绑定到视图模型,但遇到了一些问题(由于我自己对其工作原理的误解)。
我有观点:
<?xml version="1.0" encoding="utf-8" ?>
<ContentPage xmlns="http://schemas.microsoft.com/dotnet/2021/maui"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
xmlns:Local="clr-namespace:FireLearn.ViewModels"
x:Class="FireLearn.MainPage"
Title="Categories">
<ContentPage.BindingContext>
<Local:CategoryViewModel/>
</ContentPage.BindingContext>
<NavigationPage.TitleView>
<Label Text="Home"/>
</NavigationPage.TitleView>
<ListView
ItemsSource="{Binding Categories}"
HasUnevenRows="True"
IsPullToRefreshEnabled="True"
IsRefreshing="{Binding ListRefreshing, Mode=OneWay}"
RefreshCommand="{Binding RefreshCommand}"
ItemSelected="{Binding OnItemTappedChanged}"
SelectionMode="Single"
SelectedItem="{Binding SelectedCategory}">
<ListView.ItemTemplate>
<DataTemplate>
<ViewCell>
<HorizontalStackLayout
Padding="8"
VerticalOptions="Fill"
HorizontalOptions="Fill">
<Image Source="cafs_bubbles.png"
HeightRequest="64"
MaximumWidthRequest="64"
HorizontalOptions="CenterAndExpand"
VerticalOptions="CenterAndExpand"/>
<VerticalStackLayout
Padding="8"
VerticalOptions="FillAndExpand"
HorizontalOptions="FillAndExpand">
<Label Text="{Binding FormattedName}"
SemanticProperties.HeadingLevel="Level1"
FontSize="Title"
HorizontalOptions="Start"/>
<Label Text="{Binding ItemCount}"
FontSize="Subtitle"/>
<Label Text="{Binding Description}"
HorizontalOptions="Center"
LineBreakMode="WordWrap"
FontSize="Caption"
VerticalOptions="CenterAndExpand"
MaxLines="0"/>
</VerticalStackLayout>
</HorizontalStackLayout>
</ViewCell>
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
</ContentPage> …Run Code Online (Sandbox Code Playgroud) 我有一个正在使用的测试应用程序,并且正在使用 sqlite DB 填充集合视图。但是,每当我使用滑动视图从数据库中删除项目时,它都可以正常工作,但视图永远不会从集合视图中删除项目,除非重新加载整个视图。我尝试了一些不同的方法,但没有任何效果,有什么建议吗?OnAppearing 生命周期会导致任何问题吗?
<Grid BackgroundColor="White">
<StackLayout Margin="20">
<CollectionView x:Name="data"
SelectionMode="Single"
SelectionChanged="ItemSelected"
HeightRequest="750"
VerticalScrollBarVisibility="Never">
protected override async void OnAppearing()
{
base.OnAppearing();
TodoItemDatabase database = await TodoItemDatabase.Instance;
data.ItemsSource = await database.GetItemsAsync();
}
Run Code Online (Sandbox Code Playgroud)