Xamarin найти ресурс по Id, а затем искать по имени - PullRequest
0 голосов
/ 21 октября 2019

У меня есть следующий ресурс, я смог найти ресурс по идентификатору, но не могу найти, как найти дочерний элемент по имени

            <ControlTemplate x:Key="MainPageTemplate">
            <Grid
                BackgroundColor="White"
                HorizontalOptions="FillAndExpand"
                RowSpacing="0"
                VerticalOptions="FillAndExpand">
                <Grid.RowDefinitions>
                    <RowDefinition Height="50" />
                    <RowDefinition Height="*" />
                </Grid.RowDefinitions>
                <Grid.ColumnDefinitions>
                    <ColumnDefinition Width="50" />
                    <ColumnDefinition Width="*" />
                    <ColumnDefinition Width="50" />
                </Grid.ColumnDefinitions>

                <StackLayout
                    Grid.Row="0"
                    Grid.Column="0"
                    BackgroundColor="Transparent"
                    HeightRequest="50"
                    VerticalOptions="CenterAndExpand"
                    WidthRequest="50">
                    <ffimageloadingsvg:SvgCachedImage
                        Margin="10,0"
                        HeightRequest="24"
                        HorizontalOptions="StartAndExpand"
                        Source="resource://ABSCardApp.Resources.ic_menu.svg"
                        VerticalOptions="CenterAndExpand"
                        WidthRequest="24" />
                    <StackLayout.GestureRecognizers>
                        <TapGestureRecognizer Tapped="Button_Clicked" />
                    </StackLayout.GestureRecognizers>
                </StackLayout>
                <ffimageloadingsvg:SvgCachedImage
                    Grid.Row="0"
                    Grid.Column="1"
                    Margin="0,0,0,8"
                    HeightRequest="20"
                    X:Name="LogoIcon"
                    HorizontalOptions="StartAndExpand"
                    Source="resource://ABSCardApp.Resources.logo.svg"
                    VerticalOptions="CenterAndExpand"
                    WidthRequest="96" />
  ....

. Я использую этот код для полученияидентификатор ресурса

var resource = Application.Current.Resources["MainPageTemplate"];

Но меня тут разжигают, потому что я не могу использовать FindByName для этого результата, даже приведя результат к ResourceDictionary или ControlTemplate

как resource.FindByName("LogoIcon")

Я не уверен, правильно ли я все делаю правильно.

1 Ответ

1 голос
/ 22 октября 2019

Как сказал Джейсон, вы должны привязать эти свойства к свойствам модели или модели представления. Называть элемент управления пользовательского интерфейса в шаблоне бессмысленно.

Например, у вас есть controltemplate в App.xaml, вы должны использоватьпривязка для источника SvgCachedImage.

 <ControlTemplate x:Key="MainPageTemplate">
            <Grid BackgroundColor="White" VerticalOptions="Center">
                <ffimageloadingsvg:SvgCachedImage x:Name="LogoIcon" Source="{TemplateBinding BindingContext.Url}" />
                <ContentPresenter />

            </Grid>
        </ControlTemplate>

Теперь, на многих страницах контента, вы должны назначить другое значение для этого.

<ContentPage
x:Class="demo2.dictionary.Page1"
xmlns="http://xamarin.com/schemas/2014/forms"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml">
<ContentView
    x:Name="contentView"
    Padding="0,20,0,0"
    ControlTemplate="{StaticResource MainPageTemplate}">
    <StackLayout>
        <Label
            HorizontalOptions="CenterAndExpand"
            Text="Welcome to Xamarin.Forms!"
            VerticalOptions="CenterAndExpand" />

    </StackLayout>
</ContentView>

public partial  class Page1 : ContentPage, INotifyPropertyChanged
{
    private string _Url;
    public string Url
    {
        get { return _Url; }
        set
        {
            _Url = value;
            RaisePropertyChanged("Url");

        }
    }
    public Page1 ()
    {
        InitializeComponent ();
        Url = "a11.jpg";
        this.BindingContext = this;
    }

    public event PropertyChangedEventHandler PropertyChanged;


    public void RaisePropertyChanged(string propertyName)
    {
        PropertyChangedEventHandler handler = PropertyChanged;
        if (handler != null)
        {
            handler(this, new PropertyChangedEventArgs(propertyName));
        }
    }

}

Если мой ответ решенВаша проблема, пожалуйста, не забудьте пометить ответ как ответ, спасибо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...