рд╕рдВрджреЗрд╣ рдХреЗ рджрд┐рдиреЛрдВ рдореЗрдВ, рджрд░реНрджрдирд╛рдХ рд╡рд┐рдЪрд╛рд░-рд╡рд┐рдорд░реНрд╢ рдХреЗ рджрд┐рдиреЛрдВ рдореЗрдВ

рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ, рдореИрдВ рдЖрдкрдХреЛ рдмрддрд╛рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдХрд┐ рдореИрдВрдиреЗ рдЪрд▓ рд░рд╣реЗ рдорд╣рд╛рдорд╛рд░реА рдкрд░ рдЖрдВрдХрдбрд╝реЛрдВ рдХреА рдХрд▓реНрдкрдирд╛ рдХреИрд╕реЗ рдХреА, рдФрд░ рдЗрд╕рдХреЗ рд▓рд┐рдП рдЖрдк Avalonia UI рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХрд┐рди рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХреЛ рдкреВрд░рд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред



рд▓реЗрдЦрдХ рд╕реЗ
, . . тАФ MIT .

рдкрд░рд┐рдЪрдп


рдпрд╣ рдЖрд▓реЗрдЦ рдорд╛рдирддрд╛ рд╣реИ рдХрд┐ рдЖрдк рдкрд╣рд▓реЗ рд╕реЗ рд╣реА AvaloniaUI рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдХ рд╕рд╛рдзрд╛рд░рдг рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВред рдпрджрд┐ рдирд╣реАрдВ, рддреЛ AvaloniaUI рдпрд╛ Habr рдЯреНрдпреВрдЯреЛрд░рд┐рдпрд▓ рджреЗрдЦреЗрдВ ред

рдбреЗрдЯрд╛


рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдпрд╣ рд╕рд╡рд╛рд▓ рдЙрдарддрд╛ рд╣реИ рдХрд┐ рдкреНрд░рд╛рд╕рдВрдЧрд┐рдХ рдбреЗрдЯрд╛ рдФрд░ Google рдореЗрдВ рддреНрд╡рд░рд┐рдд рдЦреЛрдЬ рдХрд╣рд╛рдВ рд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХреА рдЬрд╛рдП, рдЗрд╕рдХреЗ рд▓рд┐рдП рдирд┐рдореНрди рдПрдкреАрдЖрдИ рдореЗрдВ рдореЗрд░реА рд╕рднреА рдЖрд╡рд╢реНрдпрдХрддрд╛рдУрдВ рдХреЛ рдкреВрд░рд╛ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ:

  1. рджреБрдирд┐рдпрд╛ рдкрд░ рд╕рд╛рдорд╛рдиреНрдп рдЬрд╛рдирдХрд╛рд░реА
  2. рдкреНрд░рддреНрдпреЗрдХ рджреЗрд╢ рдХреЗ рд▓рд┐рдП рд╕рд╛рдорд╛рдиреНрдп рдЬрд╛рдирдХрд╛рд░реА
  3. рдкреНрд░рддреНрдпреЗрдХ рджреЗрд╢ рдХреЗ рд▓рд┐рдП рдЗрддрд┐рд╣рд╛рд╕

рдЕрдиреБрдкреНрд░рдпреЛрдЧ рд╕рдВрд░рдЪрдирд╛


рдЖрд╡реЗрджрди 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 рдкрд░ рдкрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ ред

рдПрдХ рдЖрдлреНрдЯрд░рд╡рд░реНрдб рдХреЗ рдмрдЬрд╛рдп


рдпрд╣ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рддреГрддреАрдп-рдкрдХреНрд╖ рдПрдкреАрдЖрдИ рдкрд░ рдЖрдзрд╛рд░рд┐рдд рд╣реИ, рдФрд░ рдореБрдЭреЗ рдЖрд╢рд╛ рд╣реИ рдХрд┐ рдЬрд▓реНрдж рд╣реА рдЗрд╕ рдПрдкреАрдЖрдИ рдХрд╛ рд╕рдорд░реНрдерди рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛, рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕рдХреА рдХреЛрдИ рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реЛрдЧреАред

рдЕрдкрдирд╛ рдкреЗрди рдзреЛрдПрдВ рдФрд░ рдШрд░ рдмреИрдареЗрдВред рдФрд░ рдЕрд╡рд▓реЛрдирд┐рдпрд╛ рдХрд╛ рд╕рдорд░реНрдерди рдпрд╣рд╛рдВ рдорд┐рд▓ рд╕рдХрддрд╛ рд╣реИ ред

All Articles