рдирд┐рдпрдорд┐рдд рд╣рд┐рдорд╕реНрдЦрд▓рди

рдХрднреА-рдХрднреА рд╣рдо рд╕рдордЭ рдирд╣реАрдВ рдкрд╛рддреЗ рд╣реИрдВ рдХрд┐ рд╣рдордиреЗ рдЬреЛ рдирд┐рдпрдорд┐рдд рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХреА рд░рдЪрдирд╛ рдХреА рд╣реИ рд╡рд╣ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЬрд╛рдБрдЪрдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реИред Regex101.com рдпрд╛ рдмрдирд╛рдо рдХреЛрдб рдЬреИрд╕реЗ рдХрдИ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд╣реИрдВред рдореИрдВ рдЗрд╕ рд╕реВрдЪреА рдореЗрдВ рдПрдХ рдФрд░ рдЬреЛрдбрд╝рдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛ред

рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ рд╣рдо рджреЗрдЦреЗрдВрдЧреЗ рдХрд┐ рдЖрдк рдХреНрд░реЙрд╕-рдкреНрд▓реЗрдЯрдлрд╝реЙрд░реНрдо рдЧреНрд░рд╛рдлрд┐рдХреНрд╕ рдореЗрдВ рд░реЗрдЧреЗрдХреНрд╕ рдХреЛ рдХреИрд╕реЗ рд▓рдкреЗрдЯ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдирд┐рдпрдорд┐рдд рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐рдпреЛрдВ рдХреЗ рдкрд░реАрдХреНрд╖рдг рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рд░рд▓ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВред



рдкреНрд░рд╛рд░рдВрдн


рдПрд╡рд▓реЛрдирд┐рдпрд╛ рдпреВрдЖрдИ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдХ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдЧрд┐рдЯрд╣рдм рд╕реЗ рдЯреЗрдореНрдкрд▓реЗрдЯ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ ред
рдФрд░ mvvm рдЯреЗрдореНрдкрд▓реЗрдЯ рд╕реЗ рдПрдХ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдмрдирд╛рдПрдВред

dotnet new avalonia.mvvm -o MyApp 

рдбрд┐рдЬрд╛рдЗрди рдФрд░ рд▓реЗрдЖрдЙрдЯ


рдореБрдЦреНрдп рд╡рд┐рдВрдбреЛ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рд╕рднреА рдШрдЯрдХреЛрдВ рдХреЛ рдЧреНрд░рд┐рдб рдХреЗ рдЕрдВрджрд░ рд░рдЦреЗрдВред

  <Grid> <Grid.RowDefinitions> <RowDefinition Height = "5" /> <RowDefinition Height = "Auto" /> <RowDefinition Height = "5" /> <RowDefinition Height = "*" /> <RowDefinition Height = "5" /> </Grid.RowDefinitions> </Grid> 

рд╣рдорд╛рд░реЗ рдЖрд╡реЗрджрди рдореЗрдВ 2 рднрд╛рдЧ рд╣реЛрддреЗ рд╣реИрдВ: рдЯреВрд▓рдмрд╛рд░ рдФрд░ рдХрд╛рд░реНрдпрдХреНрд╖реЗрддреНрд░ рдХрд╛ рдКрдкрд░реА рдПрдирд╛рд▓реЙрдЧред



рд╢реАрд░реНрд╖ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ


рдпрд╣рд╛рдВ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХ рдирд┐рдпрдорд┐рдд рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХреЗ рд▓рд┐рдП рдПрдХ рдлрд╝реАрд▓реНрдб рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рдПрдХ рдЪреЗрдХрдмреЙрдХреНрд╕ рджрд┐рдЦрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ рдХрд┐ рдЯреЗрдХреНрд╕реНрдЯ рдХрд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХреИрд╕реЗ рдХрд░реЗрдВ (рд▓рд╛рдЗрди рджреНрд╡рд╛рд░рд╛ рд▓рд╛рдЗрди рдпрд╛ рдкреВрд░реЗ рдЯреБрдХрдбрд╝реЗ рдХреЗ рд░реВрдк рдореЗрдВ) рдФрд░ рдПрдХ рд╕рд╣рд╛рдпрддрд╛ рдмрдЯрдиред

рд╣рдо рдбреЙрдХ рдкреИрдирд▓ рдХреЛ рдХрдВрдЯреЗрдирд░ рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред рдпрд╣ рдирд┐рдпрдВрддреНрд░рдг рдЖрдкрдХреЛ рдХрдВрдЯреЗрдирд░ рдХреЛ рддрддреНрд╡реЛрдВ рдХреЗ рд╕рд╛рде рдЖрд╕рд╛рдиреА рд╕реЗ рднрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ, рдЙрдиреНрд╣реЗрдВ рд╡рд┐рднрд┐рдиреНрди рдкрдХреНрд╖реЛрдВ рдкрд░ рджрдмрд╛рдХрд░ рдФрд░ рдЕрдВрджрд░ рдХреЛрдИ рдЦрд╛рд▓реА рд╕реНрдерд╛рди рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред

  <DockPanel Grid.Row = "1"> 

рдФрд░ рдЗрд╕реЗ рдЯреЗрдХреНрд╕реНрдЯ рдЗрдирдкреБрдЯ рдлреАрд▓реНрдб рд╕реЗ рднрд░реЗрдВ:

  <TextBox Margin = "5, 0, 5, 0" Watermark = "Your regexp" AcceptsReturn = "False" Text = "{Binding RegText}" /> 

рдпрд╣рд╛рдВ рдпрд╣ рдПрд╡рд▓реЛрдирд┐рдпрд╛ рдпреВрдЖрдИ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕реБрдЦрдж рддреНрд░рд┐рдХреЛрдгреАрдп рдзреНрдпрд╛рди рджреЗрдиреЗ рдпреЛрдЧреНрдп рд╣реИ - рдкрд╛рда рдХреНрд╖реЗрддреНрд░реЛрдВ рдореЗрдВ рд╡реЙрдЯрд░рдорд╛рд░реНрдХ рдХреА рдЙрдкрд╕реНрдерд┐рддрд┐ред

рдкреИрдирд▓ рдореЗрдВ 2 рд░рд╛рдЬреНрдпреЛрдВ рдХреЗ рд╕рд╛рде рдПрдХ рдЪреЗрдХрдмреЙрдХреНрд╕ рдЬреЛрдбрд╝реЗрдВ, рдЬреИрд╕рд╛ рдХрд┐ IsThreeState = "рдЧрд▓рдд" рджреНрд╡рд╛рд░рд╛ рдЗрдВрдЧрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред

  <CheckBox DockPanel.Dock = "Right" Content = "By row" IsThreeState = "False" IsChecked = "{Binding IsChecked}" ToolTip.Tip = "Check for each row" /> 

рдФрд░ рдорджрдж рдХреЗ рд▓рд┐рдП рдЬрд┐рдореНрдореЗрджрд╛рд░ рдмрдЯрди:

  <Button DockPanel.Dock = "Right" Content = "?" Margin = "5, 0, 5, 0" ToolTip.Tip = "Show hints" Command = "{Binding ShowHelp}" / > 

рд╢рд╡

рдореБрдЦреНрдп рднрд╛рдЧ рдХреЛ рдЧреНрд░рд┐рдб рдореЗрдВ рд░рдЦрд╛ рдЬрд╛рдПрдЧрд╛:

  <Grid Grid.Row = "3"> <Grid.ColumnDefinitions> <ColumnDefinition Width = "*" /> <ColumnDefinition Width = "Auto" /> <ColumnDefinition Width = "0.75 *" /> </Grid.ColumnDefinitions> </Grid> 

рдЗрдирдкреБрдЯ рдлрд╝реАрд▓реНрдб рдХреЛ рдЯреЗрдХреНрд╕реНрдЯ рдмреЙрдХреНрд╕ рджреНрд╡рд╛рд░рд╛ рджрд░реНрд╢рд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ:

  <TextBox Grid.Column = "0" AcceptsReturn = "True" ScrollViewer.VerticalScrollBarVisibility = "Auto" Text = "{Binding InputText}" /> 

рдлрд╛рдбрд╝рдиреЗрд╡рд╛рд▓рд╛ рдЖрдкрдХреЛ рдЕрдкрдиреА рдЖрд╡рд╢реНрдпрдХрддрд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рджреГрд╢реНрдп рдЪреБрдирдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ:

  <GridSplitter Grid.Column = "1" /> 

рдФрд░ рдирд┐рдпрдорд┐рдд рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рдкрд░рд┐рдгрд╛рдо рдХреЛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЬрд┐рдореНрдореЗрджрд╛рд░ рдХреНрд╖реЗрддреНрд░ рдХреЛ рд╕реАрдорд╛ рдореЗрдВ рд░рдЦрд╛ рдЬрд╛рдПрдЧрд╛ рдХреНрдпреЛрдВрдХрд┐ рдЯреЗрдХреНрд╕реНрдЯ рдмреНрд▓реЙрдХ рдХрд╛ рдЕрдкрдирд╛ рдлреНрд░реЗрдо рдирд╣реАрдВ рд╣реИ:

  <Border BorderBrush = "Gray" BorderThickness = "1" Grid.Column = "2"> <TextBlock ScrollViewer.VerticalScrollBarVisibility = "Auto" Text = "{Binding OutputText}" /> </Border> 

рд╡рд┐рдВрдбреЛ рдХреА рдорджрдж рдХрд░реЗрдВ



рдПрдХ рдирдИ рд╡рд┐рдВрдбреЛ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдЗрдП рдЯрд░реНрдорд┐рдирд▓ рдХреА рдУрд░ рдореБрдбрд╝реЗрдВ

  dotnet new avalonia.window -na MyApp -n MyNewWindow 

рдЗрд╕ рд╡рд┐рдВрдбреЛ рдореЗрдВ рдХреЗрд╡рд▓ рдЬрд╛рдирдХрд╛рд░реА рд╣реЛрдЧреА рдФрд░ рдХреБрдЫ рдирд╣реАрдВ, рдЗрд╕рд▓рд┐рдП, рдХрдВрдЯреЗрдирд░реЛрдВ рдХреЛ рдЕрдирджреЗрдЦрд╛ рдХрд░рддреЗ рд╣реБрдП, рдЗрд╕ рд╡рд┐рдВрдбреЛ рдХреЛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд░реВрдк рдореЗрдВ рд▓рд┐рд╕реНрдЯрдмреЙрдХреНрд╕ рдмрдирд╛рдПрдВ:

  <ListBox ScrollViewer.VerticalScrollBarVisibility = "Visible" VirtualizationMode = "None"> </ListBox> 

рдФрд░ рдЖрд╡рд╢реНрдпрдХрддрд╛рдиреБрд╕рд╛рд░ рдЗрд╕реЗ рдЙрд╕реА рддрддреНрд╡реЛрдВ рд╕реЗ рднрд░реЗрдВ:

  <ListBoxItem> <StackPanel Orientation = "Horizontal"> <TextBlock Margin = "5" Text = "A single character of: a, b or c" /> <TextBlock Margin = "5" Classes = "green" Text = "[abc]" /> </StackPanel> </ListBoxItem> 

рд▓реЗрдЖрдЙрдЯ рдХрд╛рдлреА рд╕рд░рд▓ рд╣реИ: 2 рдлрд╝реАрд▓реНрдбреНрд╕ рдХреЗ рд╕рд╛рде рдПрдХ рд╕реНрдЯреИрдХ рдкреИрдирд▓, рдпрд╣рд╛рдБ рдЙрд▓реНрд▓реЗрдЦ рдХрд░рдиреЗ рд▓рд╛рдпрдХ рдПрдХрдорд╛рддреНрд░ рдЪреАрдЬ рдХреНрд▓рд╛рд╕реЗрд╕ рд╡рд┐рд╢реЗрд╖рддрд╛ рд╣реИ, рдЬреЛ рд╣рдореЗрдВ рд╣рдорд╛рд░реА рдЦрд┐рдбрд╝рдХрд┐рдпреЛрдВ рдХреЛ рд╕реАрдПрд╕рдПрд╕ (рдПрд╡рд▓реЛрдирд┐рдпрд╛ рдХреА рдПрдХ рдФрд░ рдЕрдЪреНрдЫреА рд╡рд┐рд╢реЗрд╖рддрд╛) рдХреА рддрд░рд╣ рд╕реНрдЯрд╛рдЗрд▓ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреА рд╣реИред

рдФрд░ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдирд┐рдпрдореЛрдВ рдХреЛ рд╣рд░реЗ рд░рдВрдЧ рдореЗрдВ рдкреЗрдВрдЯ рдХрд░реЗрдВ:

  <Window.Styles> <Style Selector = "TextBlock.green"> <Setter Property = "Foreground" Value = "Green" /> </Style> </Window.Styles> 

Mvvm рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛


рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рд╕рднреА рдорд╛рд░реНрдХрдЕрдк рддрддреНрд╡реЛрдВ рдХреЗ рд▓рд┐рдП рдлрд╝реАрд▓реНрдб рдХрд╛ рдзреНрдпрд╛рди рд░рдЦреЗрдВ:
  private bool _isChecked; private string _inputText; private string _regText; private string _outputText; 

рдЖрдЗрдП рдЙрди рддрд░реАрдХреЛрдВ рдХреЛ рдмрдирд╛рдПрдВ рдЬреЛ рдореВрд▓ рдкрд╛рда рдХреЗ рд╕рд╛рде рдореИрдЪ рдХреЗ рдкрд░рд┐рдгрд╛рдо рд▓реМрдЯрд╛рдПрдВрдЧреЗ:

  private void SetNoRowResult () { OutputText = string.Join (Environment.NewLine, new Regex (_regText) .Matches (_inputText)); } 

рдФрд░ рд▓рд╛рдЗрдиреЛрдВ рдХреЗ рд╕рд╛рде рд╕реНрд░реЛрдд рдкрд╛рда рдХреЗ рд╕рд╛рде, рдЬрд┐рд╕рдХреЗ рд▓рд┐рдП рд╣рдо рд╕реНрдкреНрд▓рд┐рдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ
  private void SetRowResult () { var r = new Regex (_regText); var s = string.Empty; foreach (var line in _inputText.Split (Environment.NewLine, StringSplitOptions.RemoveEmptyEntries)) { s + = $ "- {Environment.NewLine}"; s + = string.Join (Environment.NewLine, r.Matches (line)); s + = $ "{Environment.NewLine} - {Environment.NewLine}"; } OutputText = s; } 

рдФрд░ рдПрдХ рд╡рд┐рдзрд┐ рдЬреЛрдбрд╝реЗрдВ рдЬреЛ рд╕рд╣рд╛рдпрддрд╛ рд╡рд┐рдВрдбреЛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рддрд╛ рд╣реИ

  public void ShowHelp () { new HelpWindow (). Show (); } 

рдЧреБрдг рдФрд░ рдмрдВрдзрди

рдПрд╡рд▓реЛрдирд┐рдпрд╛ рдХреА рдПрдХ рджрд┐рд▓рдЪрд╕реНрдк рд╡рд┐рд╢реЗрд╖рддрд╛ рдПрдХ рд╡рд┐рдзрд┐ рдХреЛ рд╕реАрдзреЗ рдПрдХ рдмрдЯрди рд╕реЗ рдЬреЛрдбрд╝рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рд╣реИ:

  <Button Command = "{Binding ShowHelp}" /> 

рдЬрд┐рд╕рдХрд╛ рд╣рдо рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗред

рдЕрдиреНрдп рдХреНрд╖реЗрддреНрд░реЛрдВ рдХреЗ рд▓рд┐рдП, рд╣рдо рдХреЗрд╡рд▓ рдЧреБрдгреЛрдВ рдХреЗ рд▓рд┐рдП рдмрд╛рдзреНрдп рдХрд░рддреЗ рд╣реИрдВред рдпрд╣рд╛рдВ рдПрдХ рджрд┐рд▓рдЪрд╕реНрдк рд╡рд┐рд╢реЗрд╖рддрд╛ рдпрд╣ рд╣реИ рдХрд┐ рд╣рд┐рдорд╕реНрдЦрд▓рди рдореЗрдВ, рдмрд╛рдзреНрдпрдХрд╛рд░реА рдЕрджреНрдпрддрди рддрдм рд╣реЛрддреЗ рд╣реИрдВ рдЬрдм рдирд┐рдпрдВрддреНрд░рдг рдХреА рд╕рд╛рдордЧреНрд░реА рдмрджрд▓ рдЬрд╛рддреА рд╣реИ, рдЬреЛ wpf рдореЗрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛: UpdateSourceTrigger = рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ рд╣рд┐рдорд╕реНрдЦрд▓рди рдХрд╛рд░реНрдпреЛрдВ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рддред

рдФрд░ рдЬрдм рд╕реЗ рдЕрд╡рд▓реЛрдирд┐рдпрд╛ mvvm рдЯреЗрдореНрдкрд▓реЗрдЯ рдХреЛ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛рд╢реАрд▓ UI рд╢рд╛рдорд┐рд▓ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдЗрд╕ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЧреБрдг рдмрдирд╛рдП рдЧрдП рд╣реИрдВ:

  public string RegText { get => _regText; set { this.RaiseAndSetIfChanged (ref _regText, value); if (_isChecked) SetRowResult (); else SetNoRowResult (); } } 

рдирд┐рд╖реНрдХрд░реНрд╖ рдореЗрдВ

рдореБрдЭреЗ рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рдпрд╣ рд▓реЗрдЦ рди рдХреЗрд╡рд▓ рдЙрди рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рджрд┐рд▓рдЪрд╕реНрдкреА рдХрд╛ рд╣реЛрдЧрд╛ рдЬреЛ рдореЗрд░реА рд╕рд╛рдордЧреНрд░реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдФрд░ / рдпрд╛ рдХрд┐рд╕реА рддрд░рд╣ рдЗрд╕реЗ рд╕реБрдзрд╛рд░рддреЗ рд╣реИрдВ, рдмрд▓реНрдХрд┐ рдЙрди рд╕рднреА рдХреЛ рднреА рдЬреЛ рдЕрд╡рд▓реЛрдирд┐рдпрд╛ рд╕реЗ рдкрд░рд┐рдЪрд┐рдд рд╣реИрдВ рдпрд╛ рд╕реА # рдореЗрдВ рдХреНрд░реЙрд╕-рдкреНрд▓реЗрдЯрдлрд╝реЙрд░реНрдо рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдмрдирд╛рдиреЗ рдХреЗ рддрд░реАрдХреЛрдВ рдХреА рддрд▓рд╛рд╢ рдХрд░ рд░рд╣реЗ рд╣реИрдВред

рд╕реНрд░реЛрдд рдХреЛрдб ( рдпрд╣рд╛рдВ )

рдореИрдВ рдзрдиреНрдпрд╡рд╛рдж рдХрд╣рдирд╛ рдЪрд╛рд╣реВрдВрдЧрд╛ ForNeVeR kekekeks worldbeater

Source: https://habr.com/ru/post/hi470101/


All Articles