XAML 如何从ContentPage访问应用于ContentPage的ContentView的ControlTemplate的子级?

vu8f3i0k  于 2023-11-14  发布在  其他
关注(0)|答案(1)|浏览(123)

所以我试图设计一个页面,它可以有两个不同的外观,这取决于在运行时定义的状态。我没有太多的经验与MAUI或XAML一般,但我试图做正确的方式,所以这里是我所做的:

  • 我在ContentPage的资源中定义了两个ControlTemplate元素。
  • 我在ContentPage的内容中定义了公共UI,并定义了一个ContentView元素,它使用两个ControlTemplate元素之一的内容,该元素在页面的xaml.cs代码文件中设置,具体取决于绑定到它的ViewModel的状态。

以下是页面中的简化XAML代码:

<ContentPage xmlns="http://schemas.microsoft.com/dotnet/2021/maui"
                   xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
                   xmlns:toolkit="http://schemas.microsoft.com/dotnet/2022/maui/toolkit"
                   xmlns:local="clr-namespace:MyApp"
                   >
<ContentPage.Resources>
    <ControlTemplate x:Key="template1">
        <Grid RowDefinitions="*,*,*">
            <Label Text="TEMPLATE1 UI..."/>
        </Grid>
    </ControlTemplate>
    
    <ControlTemplate x:Key="template2">
        <Grid RowDefinitions="*,*,*">
            <Label Text="TEMPLATE2 UI..."/>
            
            <!-- I need to access this element from MainPage.xaml.cs -->
            <local:MyCustomControl x:Name="myCustomControl"/>
        </Grid>
    </ControlTemplate>
</ContentPage.Resources>

<Grid RowDefinitions="*, *, *">
    <!-- Here goes my common UI -->
    <Label Grid.Row="1" Text="COMMON UI..."/>
    
    <!-- Here goes one of my two ControlTemplate UI -->
    <ContentView x:Name="contentFromTemplate" Grid.RowSpan="3" Grid.ColumnSpan="3"/>
</Grid>

字符串
现在你可以看到,在“template 2”ControlTemplate中,有一个MyCustomControl元素。我试图从页面的cs代码访问这个元素,但没有任何成功。我知道,如果ControlTemplate要应用于页面,我可以使用GetTemplateChild方法访问它,但这在我的情况下不起作用,因为ControlTemplate应用于页面中的ContentView。

->如何从MainPage.xaml.cs访问“myCustomControl”元素?

我不确定我的方法是正确的,虽然,我感谢任何输入一个更好的,非常感谢您花时间阅读。

3hvapo4f

3hvapo4f1#

我试图尽可能避免重复UI代码,我的两个UI有很多共同点,只是一些元素会根据我的ViewModel的状态在页面上的不同位置。
作为总结,我会给出一个答案。
对于这个问题,有几种方法可以实现这一点。
1.由于这两个UT有很多共同之处,一个常见的方法是基于视图模型显示和隐藏一些元素。
例如,您可以为视图设置属性IsVisible

if(Your conditional statement is true)
      yourview.IsVisible = true;
  else
      yourview.IsVisible = false;

字符串
2.另一种方法是根据ViewModel的状态使用两个单独的页面,就像H.A.H提到的那样。

相关问题