web-dev-qa-db-ja.com

Xamarin.Forms:1つのContentPageまたはContentViewを別のContentPageに埋め込むことはできますか

Xamarinプロジェクトに複数のContentPage xamlファイルがあります。各ContentPageに共有xamlを埋め込みたいのですが。 xamlの共有部分に特別なものはありません(プラットフォーム固有の処理を行う必要はありません)。 ContentPageのxamlにタグを埋め込んで共有xamlファイルを含めるのと同じくらい簡単ではないでしょうか。誰かが私を正しい方向に向けることができますか?

14
Anthony Tietjen

ContentPageの親子(たとえば、すべての子をラップするStackLayout)を外部に配置できますxamlファイルを作成し、そのコンポーネントを各ContentPageに含めます。

外部xamlファイルは、ContentPageではなくStackLayoutタイプになります。

編集-コードサンプルを追加しました:

ヘッダーStackLayoutを追加しましょう。クラスの背後にコードを追加します。

public partial class HeaderNavigationBar 
{
    public HeaderNavigationBar()
    {
        InitializeComponent();
    }
}

次に、XAMLコードを追加します。

<StackLayout x:Class="HeaderNavigationBar"
             Orientation="Horizontal"
             HorizontalOptions="FillAndExpand"
             Padding="10"
             BackgroundColor="White">

    <Image Source="burger_icon"
           HorizontalOptions="StartAndExpand"
           Aspect="AspectFit">
        <Image.GestureRecognizers>
            <TapGestureRecognizer Command="{Binding SlideNavigationDrawerCommand}" />
        </Image.GestureRecognizers>
    </Image>
</StackLayout>

最後に、コンポーネントを再利用するページで、この参照を追加します:<HeaderNavigationBar />

13
IdoT

IdoTに感謝します。それは私にとってはうまくいきましたが、いくつかの行を追加した後。これはテンプレート/カスタムコントロール/サブフォームの作成に役立つため、Xamarin.Forms全体で簡単に追加/共有できます。

これはあなたの提案に基づいた私の完全な作品ですので、他の人と一緒にそのまま使用できます:

HeaderNavigationBar.xaml

<?xml version="1.0" encoding="utf-8" ?>
<StackLayout xmlns="http://xamarin.com/schemas/2014/forms"
             xmlns:x="http://schemas.Microsoft.com/winfx/2009/xaml"
             x:Class="App9.MVC.Views.HeaderNavigationBar"
             Orientation="Horizontal"
             HorizontalOptions="FillAndExpand"
             Padding="10"
             ackgroundColor="White">

    <Button Text="Internal 1" />
    <Button Text="Internal 2" />
</StackLayout>

ご覧のとおり、追加しました:

xmlns="http://xamarin.com/schemas/2014/forms"
xmlns:x="http://schemas.Microsoft.com/winfx/2009/xaml"

HeaderNavigationBar.csでは、StackLayoutとして宣言されています。

HeaderNavigationBar.cs

using Xamarin.Forms;

namespace App9.MVC.Views
{
    public partial class HeaderNavigationBar : StackLayout
    {
        public HeaderNavigationBar()
        {
            InitializeComponent();
        }
    }
}

それを保持する/表示するページの場合:

MainView.xaml

<?xml version="1.0" encoding="utf-8" ?>
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
             xmlns:x="http://schemas.Microsoft.com/winfx/2009/xaml"
             xmlns:common="clr-namespace:App9.MVC.Views;Assembly=App9"
             x:Class="App9.MVC.Views.MainView">

    <StackLayout Padding="0,0,0,20">
        <common:HeaderNavigationBar>
            <Button Text="External 1" />
        </common:HeaderNavigationBar>

        <Button Text="Test Button 1
                x:Name="btnPage1"
                Clicked="btnPage1_clicked" />
    </StackLayout>
</ContentPage>

お気づきのように、名前空間にはMainView内のフルパスがあります。

xmlns:common="clr-namespace:App9.MVC.Views;Assembly=App9"

また、External 1というボタンがあることがわかります。これは、コントロールがStackLayoutであり、コントロールの追加を処理できるため、内部ボタンにも表示されます。

スクリーンショット:

enter image description here

別のページ内のページについても:

再びIdoTに感謝します。

14
Reader Man San