рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ, рдореИрдВ рдЖрдкрдХреЛ рдмрддрд╛рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдХрд┐ рдореИрдВрдиреЗ рдЪрд▓ рд░рд╣реЗ рдорд╣рд╛рдорд╛рд░реА рдкрд░ рдЖрдВрдХрдбрд╝реЛрдВ рдХреА рдХрд▓реНрдкрдирд╛ рдХреИрд╕реЗ рдХреА, рдФрд░ рдЗрд╕рдХреЗ рд▓рд┐рдП рдЖрдк Avalonia UI рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХрд┐рди рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХреЛ рдкреВрд░рд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рд▓реЗрдЦрдХ рд╕реЗ, . . тАФ MIT .
рдкрд░рд┐рдЪрдп
рдпрд╣ рдЖрд▓реЗрдЦ рдорд╛рдирддрд╛ рд╣реИ рдХрд┐ рдЖрдк рдкрд╣рд▓реЗ рд╕реЗ рд╣реА AvaloniaUI рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдХ рд╕рд╛рдзрд╛рд░рдг рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВред рдпрджрд┐ рдирд╣реАрдВ, рддреЛ AvaloniaUI рдпрд╛ Habr рдЯреНрдпреВрдЯреЛрд░рд┐рдпрд▓ рджреЗрдЦреЗрдВ редрдбреЗрдЯрд╛
рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдпрд╣ рд╕рд╡рд╛рд▓ рдЙрдарддрд╛ рд╣реИ рдХрд┐ рдкреНрд░рд╛рд╕рдВрдЧрд┐рдХ рдбреЗрдЯрд╛ рдФрд░ Google рдореЗрдВ рддреНрд╡рд░рд┐рдд рдЦреЛрдЬ рдХрд╣рд╛рдВ рд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХреА рдЬрд╛рдП, рдЗрд╕рдХреЗ рд▓рд┐рдП рдирд┐рдореНрди рдПрдкреАрдЖрдИ рдореЗрдВ рдореЗрд░реА рд╕рднреА рдЖрд╡рд╢реНрдпрдХрддрд╛рдУрдВ рдХреЛ рдкреВрд░рд╛ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ:- рджреБрдирд┐рдпрд╛ рдкрд░ рд╕рд╛рдорд╛рдиреНрдп рдЬрд╛рдирдХрд╛рд░реА
- рдкреНрд░рддреНрдпреЗрдХ рджреЗрд╢ рдХреЗ рд▓рд┐рдП рд╕рд╛рдорд╛рдиреНрдп рдЬрд╛рдирдХрд╛рд░реА
- рдкреНрд░рддреНрдпреЗрдХ рджреЗрд╢ рдХреЗ рд▓рд┐рдП рдЗрддрд┐рд╣рд╛рд╕
рдЕрдиреБрдкреНрд░рдпреЛрдЧ рд╕рдВрд░рдЪрдирд╛
рдЖрд╡реЗрджрди 3 рдЕрд▓рдЧ рд╕реНрдХреНрд░реАрди рдХреЗ рд╣реЛрддреЗ рд╣реИрдВредрд╕реНрдХреНрд░реАрдирд╢реЙрдЯ рд╕реНрдХреНрд░реАрди рдХреЗ рдмреАрдЪ рдЖрдВрджреЛрд▓рдиреЛрдВ рдХреЛ рд░реВрдЯрд┐рдВрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ ред рдЗрд╕ рдмрд┐рдВрджреБ рдкрд░ рдПрдХ рджрд┐рд▓рдЪрд╕реНрдк рд╡рд┐рд╢реЗрд╖рддрд╛ UserControl рдХреЗ рдорд╛рд░реНрдЧ рдХреЗ рд▓рд┐рдП рдЯреНрд░рд┐рдЧрд░ рдХрд╛ рд╣рд╕реНрддрд╛рдВрддрд░рдг рдерд╛редрдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЗрд╕рдХреЗ ViewModel рдХреЛ рдПрдХреНрд╢рди рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рдирд╛ рдкрдбрд╝рд╛: public CountriesVM(IScreen screen, Action<Country> a)
CurrentCountyCommand =
CountriesCommand = ReactiveCommand.CreateFromObservable(
() => Router.Navigate.Execute(new CountriesVM(this,GoToCurrentCountry))
);
....
public void GoToCurrentCountry(Country c)
{
CurrentCountyCommand.Execute(c);
}
рдФрд░ рдЗрд╕ рдХрд╛рд░реНрд░рд╡рд╛рдИ рдХреЗ рд▓рд┐рдП рдХреЙрд▓ рд╕реВрдЪреА рдореЗрдВ рдПрдХ рдЖрдЗрдЯрдо рдХрд╛ рдЪрдпрди рдХрд░рдирд╛ рд╣реИ:public Country SelectedCountry
{
get => _country;
set
{
this.RaiseAndSetIfChanged(ref _country, value);
A.Invoke(value);
}
}
рдкреВрдЫрддрд╛рдЫ
рдПрдкреАрдЖрдИ рдХреЗ рд▓рд┐рдП рдХреЙрд▓ рдХреЗ рд▓рд┐рдП, рдлреНрд▓реВрд░рд▓ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред рдЬреЛ рдЖрдВрддрд░рд┐рдХ рд░реВрдк рд╕реЗ HttpClient рдФрд░ Newtosoft рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ, рдФрд░ рд╕реНрд╡рдпрдВ рд╕реНрдЯреНрд░рд┐рдВрдЧреНрд╕ рдХреЗ рд▓рд┐рдП рдПрдХ рдПрдХреНрд╕рдЯреЗрдВрд╢рди рд╣реИредрдЗрд╕рд▓рд┐рдП, рдПрдХ рдЕрдиреБрд░реЛрдз рд╕реЗ рдПрдХ рдореЙрдбрд▓ рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рдПрдХ рдкрдВрдХреНрддрд┐ рдореЗрдВ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ: var allCases = await "https://corona.lmao.ninja/all".GetJsonAsync<AllCases>();
рдЗрдореЗрдЬрд┐рд╕
Flurl рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЫрд╡рд┐ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ рдПрдХ рд╕реНрдЯреНрд░реАрдо рдорд┐рд▓реА, рдЬрд┐рд╕реЗ рдмрд┐рдЯрдореИрдк рдЙрджрд╛рд╣рд░рдг рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдореЗрдореЛрд░реАрд╕реНрдЯреНрд░реАрдо рдореЗрдВ рдкреИрдХ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:private async Task<Bitmap> GetFlag(String flagUrl)
{
var flagStream = await flagUrl.GetStreamAsync();
var memoryStream = new MemoryStream();
flagStream.CopyTo(memoryStream);
memoryStream.Position = 0;
var bitmap = new Bitmap(memoryStream);
return bitmap;
}
рд╕рдВрдЧреНрд░рд╣ рдФрд░ рдлрд╝рд┐рд▓реНрдЯрд░рд┐рдВрдЧ
рд╕рдВрдЧреНрд░рд╣ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП ReactiveUI рд╕реЗ рдбрд╛рдпрдирд╛рдорд┐рдХ рдбреЗрдЯрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ ред SourceList<Country> countries = new SourceList<Country>();
private ReadOnlyObservableCollection<Country> _collection;
public ReadOnlyObservableCollection<Country> Collection => _collection;
countries.Connect().Filter(filter).ObserveOn(RxApp.MainThreadScheduler).Bind(out _collection).Subscribe();
рдореИрдВрдиреЗ рдЗрд╕рдХреЗ рдирд╛рдо рдпрд╛ ISO3 рд╕рдВрдХреНрд╖рд┐рдкреНрдд рдирд╛рдо рд╕реЗ рдХрд┐рд╕реА рджреЗрд╢ рдХреА рдЦреЛрдЬ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдлрд╝рд┐рд▓реНрдЯрд░ рдЬреЛрдбрд╝рдиреЗ рдХрд╛ рднреА рдирд┐рд░реНрдгрдп рд▓рд┐рдпрд╛ редрдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЦреЛрдЬ рд╕реНрдЯреНрд░рд┐рдВрдЧ рд╕рдВрдкрддреНрддрд┐ рдХреЗ рд▓рд┐рдП рдмрд╛рдзреНрдп рдереА:
public string FilterName
{
get => _filterName;
set { this.RaiseAndSetIfChanged(ref _filterName, value); }
}
рдлрд╝рд┐рд▓реНрдЯрд░ рдирд┐рдпрдо рдЬреЛрдбрд╝рд╛ рдЧрдпрд╛: private Func<Country, bool> Filter(string filterName)
{
if (string.IsNullOrEmpty(filterName)) return x => true;
return x => x.Name.ToUpper().Contains(filterName.ToUpper()) || x.ISO3.Contains(filterName.ToUpper());
}
рдФрд░ рдлрд╝рд┐рд▓реНрдЯрд░ рд╕реНрд╡рдпрдВ рдмрдирд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ: var filter = this.WhenValueChanged(x => x.FilterName).Select(Filter);
рдЧреНрд░рд╛рдл рдкреНрд░рджрд░реНрд╢рди
рд░реЗрдЦрд╛рдВрдХрди рдХреЗ рд▓рд┐рдП, рдореИрдВрдиреЗ рдЕрд╡рд▓реЛрдирд┐рдпрд╛ рдХреЗ рд▓рд┐рдП рдСрдХреНрд╕реАрдкреНрд▓реЙрдЯ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ редрджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ, рд╕рдВрд╕реНрдХрд░рдг рдирдЧреЗрдЯ рдореЗрдВ рдкреБрд░рд╛рдирд╛ рд╣реИ рдпрд╛ рдореБрдЭреЗ рдпрд╣ рдирд╣реАрдВ рдорд┐рд▓рд╛, рдЗрд╕рд▓рд┐рдП рдЖрдк рдореЗрд░реЗ рджреНрд╡рд╛рд░рд╛ рдмрдирд╛рдП рдЧрдП рдирдЧреЗрдЯ рдкреИрдХреЗрдЬ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ , рдпрд╛ рдЬреАрдердм рдХреЗ рд╕рд╛рде рд╕реНрд░реЛрдд рдХреЛ рдмрд╛рд╣рд░ рдирд┐рдХрд╛рд▓ рд╕рдХрддреЗ рд╣реИрдВредрдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ App.xaml рдореЗрдВ рдЬреЛрдбрд╝рдирд╛ рд╣реЛрдЧрд╛:<StyleInclude Source="resm:OxyPlot.Avalonia.Themes.Default.xaml?assembly=OxyPlot.Avalonia"/>
рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рддрд┐рдерд┐ рдХреЗ рд╕рд╛рде рдПрдХ рдЕрдХреНрд╖ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдФрд░ рдПрдХ рдордирдорд╛рдирд╛ рд╕рдВрдЦреНрдпрд╛ рдирд╣реАрдВ (рдЬрд┐рд╕рдореЗрдВ рдСрдХреНрд╕реАрдкреНрд▓реЙрдЯ рдЖрдВрддрд░рд┐рдХ рдХрд╛рд░реНрдп рдХреЗ рд▓рд┐рдП рддрд╛рд░реАрдЦ рдХреЛ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд░рддрд╛ рд╣реИ), рдЖрдкрдХреЛ рдорд╛рд░реНрдХрдЕрдк рдореЗрдВ рдЕрдХреНрд╖ рдХреЗ рдкреНрд░рдХрд╛рд░ рдХреЛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдирд╛ рд╣реЛрдЧрд╛: <avalonia:Plot.Axes>
<avalonia:DateTimeAxis StringFormat="yyyy-MM-dd" Position="Bottom"></avalonia:DateTimeAxis>
</avalonia:Plot.Axes>
рд╕реНрд░реЛрдд рдФрд░ рдЕрдиреБрдкреНрд░рдпреЛрдЧ
рдбреЙрдЯрдиреЗрдЯ рдкреНрд░рдХрд╛рд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП , рдореИрдВрдиреЗ рдореБрдЦреНрдп рдкреНрд▓реЗрдЯрдлрд╛рд░реНрдореЛрдВ ( рдпрд╣рд╛рдВ ) рдХреЗ рд▓рд┐рдП рдмрд╛рдпрдиреЗрд░рд┐рдЬрд╝ рдХреЛ рд╕рдВрдХрд▓рд┐рдд рдХрд┐рдпрд╛ , рд▓реЗрдХрд┐рди рдЙрди рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рдЬреЛ рдЕрдзрд┐рдХ рджрд┐рд▓рдЪрд╕реНрдкреА рд▓реЗрдВрдЧреЗред рд╕реНрд░реЛрдд рдХреЛрдб github рдкрд░ рдкрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ редрдПрдХ рдЖрдлреНрдЯрд░рд╡рд░реНрдб рдХреЗ рдмрдЬрд╛рдп
рдпрд╣ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рддреГрддреАрдп-рдкрдХреНрд╖ рдПрдкреАрдЖрдИ рдкрд░ рдЖрдзрд╛рд░рд┐рдд рд╣реИ, рдФрд░ рдореБрдЭреЗ рдЖрд╢рд╛ рд╣реИ рдХрд┐ рдЬрд▓реНрдж рд╣реА рдЗрд╕ рдПрдкреАрдЖрдИ рдХрд╛ рд╕рдорд░реНрдерди рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛, рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕рдХреА рдХреЛрдИ рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реЛрдЧреАредрдЕрдкрдирд╛ рдкреЗрди рдзреЛрдПрдВ рдФрд░ рдШрд░ рдмреИрдареЗрдВред рдФрд░ рдЕрд╡рд▓реЛрдирд┐рдпрд╛ рдХрд╛ рд╕рдорд░реНрдерди рдпрд╣рд╛рдВ рдорд┐рд▓ рд╕рдХрддрд╛ рд╣реИ ред