问题描述 投票:0回答:2
.netmaui databinding到shell flyout物品的一个问题链接,该属性很愉快地解决了。 与Menuitem不同,似乎没有单击处理程序。我尝试使用menuitem,但我无法工作(也许我做错了 - 稍后看)

我着眼于使用一种行为,但用法超出了我微不足道的人类思想。我看着使用处理程序,啊,我可怜的头。 由于单击/按下flyoutItemTem会导致某些事情发生,因此我可以掌握该事件并添加自己的代码。 这里是我正在使用的一些基本代码:

appshell.xaml

<?xml version="1.0" encoding="UTF-8" ?> <Shell x:Class="TSDZ2Monitor.AppShell" xmlns="http://schemas.microsoft.com/dotnet/2021/maui" xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml" xmlns:sys="clr-namespace:System;assembly=netstandard" xmlns:local="clr-namespace:TSDZ2Monitor" xmlns:pages="clr-namespace:TSDZ2Monitor.Pages" xmlns:parameters="clr-namespace:TSDZ2Monitor.Pages.Parameters" xmlns:assistlevels="clr-namespace:TSDZ2Monitor.Pages.Parameters.AssistLevels" xmlns:graphvariables="clr-namespace:TSDZ2Monitor.Pages.Parameters.GraphVariables" Shell.FlyoutBehavior="Flyout" FlyoutHeaderBehavior="Default" FlyoutVerticalScrollMode="Auto" FlyoutBackgroundColor="{StaticResource FlyoutBackgroundColor}"> <Shell.BindingContext> <local:ControlMenuViewModelM /> </Shell.BindingContext> <Shell.FlyoutHeaderTemplate> <DataTemplate> <Grid BackgroundColor="{StaticResource FlyoutBackgroundColor}" HeightRequest="200"> <Image HeightRequest="200" Source="bicycle.svg" Margin="10, 10, 10, 10" Opacity="0.6" /> <Label Text="TSDZ2 Monitor" TextColor="White" FontAttributes="Bold" /> </Grid> </DataTemplate> </Shell.FlyoutHeaderTemplate> <Shell.FlyoutFooterTemplate> <DataTemplate> <StackLayout> <Label Text="TSDZ2" TextColor="GhostWhite" FontAttributes="Bold" HorizontalOptions="Center" /> <Label Text="{Binding Source={x:Static sys:DateTime.Now}, StringFormat='{0:MMMM dd, yyyy}'}" TextColor="GhostWhite" HorizontalOptions="Center" /> </StackLayout> </DataTemplate> </Shell.FlyoutFooterTemplate> <Shell.ItemTemplate> <DataTemplate> <Grid ColumnDefinitions="0.2*, 0.8*"> <Image Grid.Column="0" Source="{Binding FlyoutIcon}" Margin="0, 20, 0, 10" VerticalOptions="Center" HeightRequest="30" /> <Label Grid.Column="1" Text="{Binding Title}" TextColor="Yellow" FontSize="20" FontAttributes="Bold" VerticalTextAlignment="Center" /> </Grid> </DataTemplate> </Shell.ItemTemplate> <ShellContent Title="Display" Icon="speedometer.svg" ContentTemplate="{DataTemplate pages:DisplayPage}" /> <ShellContent Title="Bluetooth" Icon="bluetooth.svg" IsVisible="{Binding ShowMainMenu}" ContentTemplate="{DataTemplate pages:BluetoothPage}" /> <ShellContent Title="Tracks" Icon="tracks.svg" IsVisible="{Binding ShowMainMenu}" ContentTemplate="{DataTemplate pages:TracksPage}" /> <ShellContent Title="Parameters" Icon="parameters.svg" IsVisible="{Binding ShowMainMenu}" <-------this what I want to intercept ContentTemplate="{DataTemplate pages:ParametersPage}" /> <ShellContent Title="Settings" Icon="settings.svg" IsVisible="{Binding ShowMainMenu}" ContentTemplate="{DataTemplate pages:SettingsPage}" /> <ShellContent Title="About" Icon="about.svg" IsVisible="{Binding ShowMainMenu}" ContentTemplate="{DataTemplate pages:AboutPage}" /> <ShellContent Title="Assist Level" IsVisible="{Binding ShowParameters}" ContentTemplate="{DataTemplate parameters:AssistLevelPage}" /> <ShellContent Title="Assist Level Power" IsVisible="{Binding ShowAssistLevels}" ContentTemplate="{DataTemplate assistlevels:AssistLevelPowerPage}" /> <ShellContent Title="Assist Level Torque" IsVisible="{Binding ShowAssistLevels}" ContentTemplate="{DataTemplate assistlevels:AssistLevelTorquePage}" /> <ShellContent Title="Assist LevelCadence" IsVisible="{Binding ShowAssistLevels}" ContentTemplate="{DataTemplate assistlevels:AssistLevelCadencePage}" /> <ShellContent Title="Assist LevelEMTB" IsVisible="{Binding ShowAssistLevels}" ContentTemplate="{DataTemplate assistlevels:AssistLevelEMTBPage}" /> <ShellContent Title="Battery" IsVisible="{Binding ShowParameters}" ContentTemplate="{DataTemplate parameters:BatteryPage}" /> <ShellContent Title="Motor" IsVisible="{Binding ShowParameters}" ContentTemplate="{DataTemplate parameters:MotorPage}" /> <ShellContent Title="Motor Temperature" IsVisible="{Binding ShowParameters}" ContentTemplate="{DataTemplate parameters:MotorTemperaturePage}" /> <ShellContent Title="SoC" IsVisible="{Binding ShowParameters}" ContentTemplate="{DataTemplate parameters:SoCPage}" /> <ShellContent Title="Startup Boost" IsVisible="{Binding ShowParameters}" ContentTemplate="{DataTemplate parameters:StartupBoostPage}" /> <ShellContent Title="Street Mode" IsVisible="{Binding ShowParameters}" ContentTemplate="{DataTemplate parameters:StreetModePage}" /> <ShellContent Title="Technical" IsVisible="{Binding ShowParameters}" ContentTemplate="{DataTemplate parameters:TechnicalPage}" /> <ShellContent Title="Torque Sensor" IsVisible="{Binding ShowParameters}" ContentTemplate="{DataTemplate parameters:TorqueSensorPage}" /> <ShellContent Title="Trip Memories" IsVisible="{Binding ShowParameters}" ContentTemplate="{DataTemplate parameters:TripMemoriesPage}" /> <ShellContent Title="Various" IsVisible="{Binding ShowParameters}" ContentTemplate="{DataTemplate parameters:VariousPage}" /> <ShellContent Title="Wheel" IsVisible="{Binding ShowParameters}" ContentTemplate="{DataTemplate parameters:WheelPage}" /> <ShellContent Title="Graph Variables" IsVisible="{Binding ShowParameters}" ContentTemplate="{DataTemplate parameters:GraphVariablesPage}" /> <ShellContent Title="Battery Current Graph" IsVisible="{Binding ShowGraphParameters}" ContentTemplate="{DataTemplate graphvariables:VarsBatteryCurrentPage}" /> <ShellContent Title="Battery Voltage Graph" IsVisible="{Binding ShowGraphParameters}" ContentTemplate="{DataTemplate graphvariables:VarsBatteryVoltagePage}" /> <ShellContent Title="Cedence Graph" IsVisible="{Binding ShowGraphParameters}" ContentTemplate="{DataTemplate graphvariables:VarsCadencePage}" /> <ShellContent Title="Human Power Graph" IsVisible="{Binding ShowGraphParameters}" ContentTemplate="{DataTemplate graphvariables:VarsHumanPowerPage}" /> <ShellContent Title="Motor Current Graph" IsVisible="{Binding ShowGraphParameters}" ContentTemplate="{DataTemplate graphvariables:VarsMotorCurrentPage}" /> <ShellContent Title="Motor FOC Graph" IsVisible="{Binding ShowGraphParameters}" ContentTemplate="{DataTemplate graphvariables:VarsMotorFOCPage}" /> <ShellContent Title="Motor Power Graph" IsVisible="{Binding ShowGraphParameters}" ContentTemplate="{DataTemplate graphvariables:VarsMotorPowerPage}" /> <ShellContent Title="Motor PWM Graph" IsVisible="{Binding ShowGraphParameters}" ContentTemplate="{DataTemplate graphvariables:VarsMotorPWMPage}" /> <ShellContent Title="Motor Speed Graph" IsVisible="{Binding ShowGraphParameters}" ContentTemplate="{DataTemplate graphvariables:VarsMotorSpeedPage}" /> <ShellContent Title="Motor Temperature Graph" IsVisible="{Binding ShowGraphParameters}" ContentTemplate="{DataTemplate graphvariables:VarsMotorTemperaturePage}" /> <ShellContent Title="Speed Graph" IsVisible="{Binding ShowGraphParameters}" ContentTemplate="{DataTemplate graphvariables:VarsSpeedPage}" /> <ShellContent Title="Trip Distance Graph" IsVisible="{Binding ShowGraphParameters}" ContentTemplate="{DataTemplate graphvariables:VarsTripDistancePage}" /> <ShellContent Title="Watts / Km Graph" IsVisible="{Binding ShowGraphParameters}" ContentTemplate="{DataTemplate graphvariables:VarsWattsKmPage}" /> </Shell>

视图模型/controlmenuviewModel.cs

namespace TSDZ2Monitor; public partial class ControlMenuViewModel : ObservableObject { [ObservableProperty] bool showMainMenu = true; [ObservableProperty] bool showParameters = false; [ObservableProperty] bool showAssistLevels = false; [ObservableProperty] bool showGraphParameters = false; public ICommand ShowParametersCommand => new Command(ChangeMenuControl); public void ChangeMenuControl() { Console.WriteLine($"Before {ShowMainMenu} {ShowParameters} {ShowAssistLevels} {ShowGraphParameters}"); ShowMainMenu = !ShowMainMenu; ShowParameters = !ShowParameters; Console.WriteLine($"After {ShowMainMenu} {ShowParameters} {ShowAssistLevels} {ShowGraphParameters}"); } }

我可以手动打开和关闭显示页面上的按钮(感谢COLEX -MSFT),但我在这里很困惑。很高兴听到任何想法,包括重构

哦,这是我用menuitem
所做的

<MenuItem Text="Parameters - by menuitem" Command="{Binding ShowParametersCommand}" />

它崩溃了我的应用
[Choreographer] Skipped 984 frames! The application may be doing too much work on its main thread. **System.ArgumentOutOfRangeException:** 'Index was out of range. Must be non-negative and less than the size of the collection. (Parameter 'index')' and then again

???在方法末尾更改menucontrol()的方法结束时,它失败了。我不知道它指的是什么索引!

什么,我更喜欢使用flyoutitem,但是如果需要的话,我会使用benuitem(也许无论如何是更好的用例? sorry,我知道这里有两个问题,但它们是链接的。

G
    

我注意到,如果我将可见的标志设置为false,那么我会收到有关未设置Active Shell项目的错误。您是否在外壳中添加了任何外壳项目?
我怀疑如果在appshell.xaml list中的第一个项目上设置false,则可以看出的标志会导致渲染失败。
I刚刚进行了测试,实际上,如果第一个项目附加到标志上,那么我的应用程序会崩溃,但是,如果我不让第一个ITEN使用可见的标志,则该设计可以按预期工作。

这种使用Menuitem控制项目的显示。我仍然希望使用flyoutitem的解决方案。

我可能会尝试将Shell列表中的假人第一项的文本值设置为空白。

工作室,解决方法...

eDit:我注意到重读文档时;

Menuitem类具有点击事件和命令属性。因此,menuitem对象可以使场景对响应的Menuitem进行响应。

.net shell maui
2个回答
0
投票

guess我吠叫错误的树:(

我仍然在使用的任何基础列表中仍在遇到第一项问题的问题 - 索引无限制。 实验后编辑:

我创建了一个几乎空白的毛伊岛解决方案。 我有一个基本的主页。

在appshell.xaml中,我首先删除了sellsitem:

<Shell x:Class="ShellItemsTest.AppShell" xmlns="http://schemas.microsoft.com/dotnet/2021/maui" xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml" xmlns:local="clr-namespace:ShellItemsTest" Shell.FlyoutBehavior="Flyout"> </Shell>

这进入“断点”模式并给出了错误消息:

System.InvalidOperationException Message=Active Shell Item not set. Have you added any Shell Items to your Shell?

,太公平了

然后我添加了一个新的外壳项目,并设置了它的属性=“ false”

<ShellContent Title="Home" IsVisible="False" ContentTemplate="{DataTemplate local:MainPage}" Route="MainPage" />

这太破产了,发出了同样的信息。

我不知道这里该怎么想?是设计还是应该是一个错误。我倾向于认为后者是我的期望是有一个外壳,不应该渲染吗?

然后,我尝试了两个,然后进行两个具有不同组合的true/false组合的外壳项目。

结果似乎是,如果看不到任何项目,请出现中断和错误。

如果至少可见一项,无论该位置如何,都可以。

如果将两个项目设置为false,而第三集则将应用程序运行,但是如果我将第三个项目更改为false(在热重载下),则该应用程序进入断点模式,我也会看到错误:

**System.ArgumentOutOfRangeException:** 'Index was out of range. Must be non-negative and less than the size of the collection. (Parameter 'index')'

故事的寓意似乎是您必须在任何时候都能看到至少一个飞行项目。
我不知道这里是否涉及任何时间问题 - 它是否会异步工作。
我将在Github中为.Net Maui提出一份报告,看看Devs所说的话。 :)

G


我指出(最终)shell的文档中的这个小宝石:

Note: There's also a Shell.FlyoutItemIsVisible attached property, which can be set on FlyoutItem, MenuItem, Tab, and ShellContent objects.

实际上,这里有许多操作的属性:
Flyout items are visible in the flyout by default. However, an item can be hidden in the flyout with the FlyoutItemIsVisible property, and removed from the flyout with the IsVisible property:

也提到了shell.flyoutitemisvis.

解决这可以解决我的问题。 doh!

因此,我想做的是捕获飞行菜单项上的按/单击事件,以便我可以导致菜单项出现或消失。

to the the documentation

Menuitem类有一个

Clicked

活动,并且是一个

Command

财产。

因此,您可以做以下操作:

<MenuItem Text="Help" Clicked="MenuItem_Clicked" IconImageSource="help.png" />

0
投票
然后在后面的代码中处理事件并设置:

FlyoutBehavior = FlyoutBehavior.Disabled;
    

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.