XAML 如何在多窗口MAUI应用中访问和更改位于不同窗口中的控件的属性?

oxiaedzo  于 2023-04-03  发布在  其他
关注(0)|答案(1)|浏览(172)

两年前,我为windows设计了一个游戏记分牌应用程序,它是一个多窗口应用程序(确切地说是两个窗口),其中一个窗口包含增加或减少游戏分数的控件,另一个窗口是显示分数的实际记分牌。记分牌窗口将通过投影仪向公众显示(Windows扩展桌面),而另一个窗口将在膝上型计算机屏幕上并由记分员操作。
使用WPF控件,XAML和C#,它可以直接编码。
在主窗口代码文件中我声明了第二个窗口的一个示例

public scoreboard1 sboard = new scoreboard1();

我在主窗口中编写了一个click事件,通过使用下面简单的代码行来更改其他窗口中的text属性。

sboard.txtBlckScoreBoardHTPoints.Text = "btn clicked on main window";

我如何在MAUI中简单地做同样的事情?
我试着按照类似的教程(如下面的链接)在MAUI应用程序中的多窗口支持。他们只是指创建和打开另一个窗口。https://learn.microsoft.com/en-us/dotnet/maui/fundamentals/windows?view=net-maui-7.0
我需要一个例子,说明如何访问和操纵的控制窗口,从另一个窗口的MAUI范式
我当前使用Microsoft Visual Studio Enterprise 2022(64位)版本17.5.3
我在MAUI尝试了以下方法
到目前为止在一个按钮的点击事件中

var pjScreen = new Window(new screen2());

打开窗口,我使用下面的代码行。

Application.Current.OpenWindow(pjScreen);
imzjd6km

imzjd6km1#

说实话,界面设计要想清楚,在移动的端,界面不大,如果把两个窗口放在两个页面上,那么两个窗口一般不会同时出现在一个页面上。
根据接口设计的不同,实现方法也不同。
如果两个窗口在同一页上,可以用Data binding and MVVM来实现。
您可以参考以下代码:
1.创建视图模型MyViewModel.cs

public class MyViewModel: INotifyPropertyChanged 
    {
        private int _result;
        public int Result 
        {
            get => _result;
            set
            {
                SetProperty(ref _result, value);
            }
        }

        public ICommand IncreaseCommand => new Command(() => {

            Result++;
        });

        public ICommand DecreaseCommand => new Command(() => {

            Result--;
        });

        public MyViewModel() {
            Result = 0;
        }

        bool SetProperty<T>(ref T storage, T value, [CallerMemberName] string propertyName = null)
        {
            if (Object.Equals(storage, value))
                return false;

            storage = value;
            OnPropertyChanged(propertyName);
            return true;
        }

        protected void OnPropertyChanged([CallerMemberName] string propertyName = null)
        {
            PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
        }

        public event PropertyChangedEventHandler PropertyChanged;
    }

2.用法示例:

<?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:MauiApp328"
             x:Class="MauiApp328.MainPage">

    <ContentPage.BindingContext>
        <local:MyViewModel></local:MyViewModel>
    </ContentPage.BindingContext>

    <ScrollView>
        <VerticalStackLayout
            Spacing="25"
            Padding="30,0"
            VerticalOptions="Start">

            <Label
                x:Name="sBoard"
                Text="{Binding Result}"
                FontSize="32"
                HorizontalOptions="Center" />

            <HorizontalStackLayout  
                HorizontalOptions="FillAndExpand"
                >
                <Button Text="+" WidthRequest="80" Command="{Binding IncreaseCommand}"></Button>

                <Button Text="-"  WidthRequest="80" Command="{Binding DecreaseCommand}" Margin="10,0,10,0"></Button>

            </HorizontalStackLayout>
        </VerticalStackLayout>
    </ScrollView>

</ContentPage>

注:

如果两个窗口在两个不同的页面上,可以在两个页面之间传递数据.
对于如何在两个页面之间传递数据,您可以检查大小写:回传数据或pass parameters using constructor

相关问题