Способ, которым я бы это реализовал, - это создать пользовательский элемент управления многократного использования, который должен содержать всю логику / анимацию / xaml. Так должно быть что-то вроде этого:
Ваш пользовательский элемент управления Xaml:
<?xml version="1.0" encoding="UTF-8"?>
<ContentView xmlns="http://xamarin.com/schemas/2014/forms"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
xmlns:d="http://xamarin.com/schemas/2014/forms/design"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable="d"
x:Class="TestingXamarin.MyCustomText"
x:Name="mycontrol">
<ContentView.Content>
<StackLayout>
<Label x:Name="mytext" />
</StackLayout>
</ContentView.Content>
</ContentView>
Ваш код для пользовательского элемента управления:
public partial class MyCustomText : ContentView
{
public static readonly BindableProperty TextProperty = BindableProperty.Create(nameof(Text), typeof(string), typeof(MyCustomText),
propertyChanged: async(s, ea, eas) =>
{
var myControl = s as MyCustomText;
var myTextControl = myControl.mytext;
await myTextControl.FadeTo(0, 100);
myTextControl.Text = eas.ToString();
await myTextControl.FadeTo(1, 100);
});
public string Text
{
get
{
return (string)GetValue(TextProperty);
}
set
{
SetValue(TextProperty, value);
}
}
public MyCustomText()
{
InitializeComponent();
}
}
Тогда вы можете использовать это так: Ваша страница:
<StackLayout
HorizontalOptions="Center"
VerticalOptions="CenterAndExpand">
<!-- Place new controls here -->
<Label Text="This is my control:" />
<myapp:MyCustomText Text="{Binding Title}" />
<Button Text="Change text" Command="{Binding ChangeTextCommand}" />
</StackLayout>
Затем, наконец, ваша ViewModel (независимо от того, какую платформу вы используете):
public class MainViewModel : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
private string title;
public string Title
{
get => title;
set
{
if(value != title)
{
title = value;
if (this.PropertyChanged != null)
this.PropertyChanged(this, new PropertyChangedEventArgs("Title"));
}
}
}
public Command ChangeTextCommand
{
get => new Command(() => Title = $"Time Now is {DateTime.Now}");
}
}