await Task.Delay(250);
using System;
using System.Threading;
using System.Threading.Tasks;
namespace ProgressBarExample
{
internal class Analyzer
{
private readonly SynchronizationContext _synchronizationContext;
public Analyzer()
{
// Если экземпляр класса будет создан в UI потоке,
// то здесь будет контекст синхронизации UI потока, иначе пула потоков
_synchronizationContext = SynchronizationContext.Current ?? new SynchronizationContext();
}
public event EventHandler<AnalyzerEventArgs> ProgressChanged;
public Task<Data> DoWork()
{
return Task.Run(async () =>
{
for (int i = 0; i < 100; i++)
{
// Имитация долгой работы
await Task.Delay(250);
// Здесь ты можешь так же как в своём коде вызывать OnProgressChanged
// раз в несколько миллисекунд. В форме в UI потоке без Invoke обрабатывать
// событие, выводя те данные, которые ты поместишь в AnalyzerEventArgs
OnProgressChanged(new AnalyzerEventArgs("line " + (i + 1), 100));
}
return new Data() { Text = "Данные " };
});
}
private void OnProgressChanged(AnalyzerEventArgs args)
{
// Перенаправляем выполнение в UI поток не ожидая пока отработает метод обработчик события.
_synchronizationContext.Post(state =>
{
ProgressChanged?.Invoke(this, (AnalyzerEventArgs)state);
}, args); // args передаётся в переменную state (грубо говоря)
}
}
}
namespace ProgressBarExample
{
public class AnalyzerEventArgs
{
public int MaxLines { get; }
public string CurrentLine { get; }
public AnalyzerEventArgs(string currentLine, int maxLines)
{
CurrentLine = currentLine;
MaxLines = maxLines;
}
}
}
namespace ProgressBarExample
{
public class Data
{
public string Text { get; set; }
}
}
<Window
x:Class="WpfDataGrid.Views.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:system="clr-namespace:System;assembly=mscorlib"
xmlns:viewModels="clr-namespace:WpfDataGrid.ViewModels"
Title="MainWindow"
Width="800"
Height="450"
DataContext="{Binding Mode=OneWay, RelativeSource={RelativeSource Self}}"
WindowStartupLocation="CenterScreen"
mc:Ignorable="d">
<Window.Resources>
<SolidColorBrush
x:Key="BackgroundOfSelectedDataGridRow"
Color="#B6B6B6" />
<SolidColorBrush
x:Key="BorderBrushOfSelectedDataGridRow"
Color="#FF2485C9" />
<SolidColorBrush
x:Key="ForegroundOfSeletedDataGridRow"
Color="Black" />
<SolidColorBrush
x:Key="GridLinesBrush"
Color="#FFB0B0B0" />
<FontFamily x:Key="DefaultFontFamylyKey">
Microsoft Sans Serif
</FontFamily>
<Style
x:Key="DefaultDataGridCellStyle"
TargetType="{x:Type DataGridCell}">
<Style.Triggers>
<Trigger Property="IsSelected" Value="True">
<Setter Property="Background" Value="#B2FFD0A2" />
<Setter Property="BorderBrush" Value="#99FFE5CC" />
<Setter Property="Foreground" Value="Black" />
</Trigger>
</Style.Triggers>
</Style>
<Style
x:Key="DataGridStyle"
TargetType="{x:Type DataGrid}">
<Setter Property="RowBackground" Value="#FFE6E6E6" />
<Setter Property="AlternatingRowBackground" Value="#FFF1F1F1" />
<Setter Property="AlternationCount" Value="2" />
<Setter Property="HorizontalGridLinesBrush" Value="{StaticResource GridLinesBrush}" />
<Setter Property="VerticalGridLinesBrush" Value="{StaticResource GridLinesBrush}" />
<Setter Property="FontFamily" Value="{StaticResource DefaultFontFamylyKey}" />
<Setter Property="FontSize" Value="15" />
<Setter Property="SelectionMode" Value="Single" />
<Setter Property="RowStyle">
<Setter.Value>
<Style TargetType="{x:Type DataGridRow}">
<Style.Triggers>
<Trigger Property="IsMouseOver" Value="True">
<Setter Property="Background" Value="{StaticResource BackgroundOfSelectedDataGridRow}" />
<Setter Property="BorderBrush" Value="{StaticResource BorderBrushOfSelectedDataGridRow}" />
<Setter Property="Foreground" Value="{StaticResource ForegroundOfSeletedDataGridRow}" />
<Setter Property="Tag" Value="{Binding}" />
</Trigger>
<Trigger Property="IsSelected" Value="True">
<Setter Property="Background" Value="#B2FFD0A2" />
<Setter Property="BorderBrush" Value="#99FFE5CC" />
<Setter Property="Foreground" Value="Black" />
</Trigger>
</Style.Triggers>
</Style>
</Setter.Value>
</Setter>
<Setter Property="CellStyle" Value="{StaticResource DefaultDataGridCellStyle}" />
</Style>
</Window.Resources>
<Grid>
<Grid.RowDefinitions>
<RowDefinition />
<RowDefinition Height="Auto" />
</Grid.RowDefinitions>
<DataGrid
Margin="10,10,10,0"
AutoGenerateColumns="False"
ItemsSource="{Binding Collection}"
Style="{StaticResource DataGridStyle}">
<DataGrid.ItemsPanel>
<ItemsPanelTemplate>
<VirtualizingStackPanel
IsVirtualizing="True"
VirtualizationMode="Recycling" />
</ItemsPanelTemplate>
</DataGrid.ItemsPanel>
<DataGrid.Columns>
<DataGridTemplateColumn
x:Name="PropertiesUpdateIndicatorColumn"
CanUserReorder="False"
CanUserResize="False"
CanUserSort="False"
IsReadOnly="True">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate DataType="viewModels:ItemViewModel">
<Rectangle Fill="{Binding IsChecked, Converter={StaticResource BooleanToBrushConverter}}" />
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
<DataGridTemplateColumn.CellEditingTemplate>
<DataTemplate DataType="viewModels:ItemViewModel">
<TextBlock Text="{Binding IsChecked, UpdateSourceTrigger=PropertyChanged}" />
</DataTemplate>
</DataGridTemplateColumn.CellEditingTemplate>
</DataGridTemplateColumn>
<DataGridTemplateColumn
Width="50"
ClipboardContentBinding="{x:Null}"
Header="Выбран">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate DataType="viewModels:ItemViewModel">
<CheckBox
HorizontalContentAlignment="Center"
VerticalContentAlignment="Center"
IsChecked="{Binding IsChecked, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" />
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
<DataGridTemplateColumn.HeaderTemplate>
<ItemContainerTemplate>
<TextBlock
Text=""
ToolTip="{Binding Path=Text, RelativeSource={RelativeSource Self}}"
ToolTipService.HasDropShadow="False"
ToolTipService.Placement="Relative">
<TextBlock.Resources>
<Style TargetType="ToolTip">
<Setter Property="VerticalOffset" Value="-1" />
<Setter Property="HorizontalOffset" Value="-1" />
<Setter Property="OverridesDefaultStyle" Value="True" />
<Setter Property="HasDropShadow" Value="False" />
</Style>
</TextBlock.Resources>
</TextBlock>
</ItemContainerTemplate>
</DataGridTemplateColumn.HeaderTemplate>
</DataGridTemplateColumn>
<DataGridTemplateColumn
x:Name="TitleColumn"
ClipboardContentBinding="{x:Null}"
Header="Название"
SortMemberPath="Title">
<DataGridTemplateColumn.HeaderTemplate>
<ItemContainerTemplate>
<TextBlock
Text="Название"
ToolTip="{Binding Path=Text, RelativeSource={RelativeSource Self}}"
ToolTipService.HasDropShadow="False"
ToolTipService.Placement="Relative">
<TextBlock.Resources>
<Style TargetType="ToolTip">
<Setter Property="VerticalOffset" Value="-1" />
<Setter Property="HorizontalOffset" Value="-1" />
<Setter Property="OverridesDefaultStyle" Value="True" />
<Setter Property="HasDropShadow" Value="False" />
</Style>
</TextBlock.Resources>
</TextBlock>
</ItemContainerTemplate>
</DataGridTemplateColumn.HeaderTemplate>
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<TextBlock Text="{Binding Title, Mode=OneWay}" />
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
<DataGridTemplateColumn.CellEditingTemplate>
<DataTemplate>
<TextBox
MaxLength="120"
Text="{Binding Title, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" />
</DataTemplate>
</DataGridTemplateColumn.CellEditingTemplate>
</DataGridTemplateColumn>
</DataGrid.Columns>
</DataGrid>
<Button
Grid.Row="1"
Width="75"
Margin="10,6,0,10"
HorizontalAlignment="Left"
VerticalAlignment="Top"
Click="OnDeleteButtonClick"
Content="Delete" />
</Grid>
</Window>
<Window
x:Class="WpfVectorImage.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:icons="clr-namespace:WpfVectorImage.Icons"
xmlns:local="clr-namespace:WpfVectorImage"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
Title="MainWindow"
Width="800"
Height="450"
mc:Ignorable="d">
<Grid>
<icons:DumbbellIcon />
</Grid>
</Window>
<UserControl
x:Class="WpfVectorImage.Icons.DumbbellIcon"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:local="clr-namespace:WpfVectorImage.Icons"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
d:DesignHeight="450"
d:DesignWidth="800"
mc:Ignorable="d">
<Viewbox Stretch="Uniform">
<Canvas
Name="Layer_1"
Width="512"
Height="512">
<Canvas.RenderTransform>
<TranslateTransform X="0" Y="0" />
</Canvas.RenderTransform>
<Canvas.Resources />
<Canvas Name="g79">
<Canvas Name="g73">
</Canvas>
</Canvas>
</Canvas>
</Viewbox>
</UserControl>
int i = CarNumber.Length; // Я уже переименовал и свойства
int v = CarMark.Length;
if (i <= 0)
{
dataProperty = $"Данной машины не найдено на парковке";
dataPlace = $"Повторите попытку";
}
$"Данной машины не найдено на парковке";
namespace PageNavigation.Services
{
public interface INavigationService
{
void NavigateToPage1();
void NavigateToPage2();
}
}
using System.Windows.Controls;
using PageNavigation.Pages;
namespace PageNavigation.Services
{
public class NavigationService : INavigationService
{
private readonly Frame _frame;
public NavigationService(Frame frame)
{
_frame = frame;
}
public void NavigateToPage1()
{
_frame.Navigate(new Page1());
}
public void NavigateToPage2()
{
_frame.Navigate(new Page2());
}
}
}
using System.Windows.Controls;
namespace PageNavigation.Services
{
public static class Ioc
{
public static INavigationService NavigationService { get; private set; }
public static void Init(Frame frame)
{
NavigationService = new NavigationService(frame);
}
}
}
using System.Windows.Controls;
using Autofac;
namespace PageNavigation.Services
{
public static class Ioc
{
private static IContainer _container;
public static INavigationService NavigationService
{
get { return _container.Resolve<INavigationService>(); }
}
//public static MainViewModel MainViewModel
//{
// get { return _container.Resolve<MainViewModel>(); }
//}
public static void Init(Frame frame)
{
var builder = new ContainerBuilder();
builder.RegisterType<NavigationService>()
.As<INavigationService>()
.SingleInstance()
.WithParameter(new TypedParameter(typeof(Frame), frame));
//builder.RegisterType<MainViewModel>()
// .SingleInstance();
_container = builder.Build();
}
}
}
<Window
x:Class="PageNavigation.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
Title="MainWindow"
Width="525"
Height="350"
Loaded="OnLoaded"
WindowStartupLocation="CenterScreen"
mc:Ignorable="d">
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="266*" />
<RowDefinition Height="Auto" />
</Grid.RowDefinitions>
<Frame x:Name="_frame" />
<StackPanel
Grid.Row="1"
Margin="8,0,0,6"
Orientation="Horizontal">
<Button
MinWidth="75"
MinHeight="29"
HorizontalAlignment="Left"
VerticalAlignment="Top"
Click="OnNavigateToPage1ButtonClick"
Content="Page1" />
<Button
MinWidth="75"
MinHeight="29"
Margin="8,0,0,0"
HorizontalAlignment="Left"
VerticalAlignment="Top"
Click="OnNavigateToPage2ButtonClick"
Content="Page2" />
</StackPanel>
</Grid>
</Window>
using System.Windows;
using PageNavigation.Services;
namespace PageNavigation
{
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
}
private void OnLoaded(object sender, RoutedEventArgs e)
{
Ioc.Init(_frame);
}
private void OnNavigateToPage1ButtonClick(object sender, RoutedEventArgs e)
{
Ioc.NavigationService.NavigateToPage1();
}
private void OnNavigateToPage2ButtonClick(object sender, RoutedEventArgs e)
{
Ioc.NavigationService.NavigateToPage2();
}
}
}
<Page
x:Class="PageNavigation.Pages.Page1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
Title="Page1"
d:DesignHeight="300"
d:DesignWidth="300"
mc:Ignorable="d">
<Grid>
<TextBlock Margin="5">
Это Page 1
</TextBlock>
<Button
Padding="12,3,12,3"
HorizontalAlignment="Center"
VerticalAlignment="Center"
Click="OnNavigateToAnotherPageButtonClick"
Content="Перейти на Page 2" />
</Grid>
</Page>
using System.Windows.Controls;
using PageNavigation.Services;
namespace PageNavigation.Pages
{
public partial class Page1 : Page
{
public Page1()
{
InitializeComponent();
}
private void OnNavigateToAnotherPageButtonClick(object sender, System.Windows.RoutedEventArgs e)
{
Ioc.NavigationService.NavigateToPage2();
}
}
}
<Page
x:Class="PageNavigation.Pages.Page2"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
Title="Page2"
d:DesignHeight="300"
d:DesignWidth="300"
mc:Ignorable="d">
<Grid>
<TextBlock Margin="5">
Это Page 2
</TextBlock>
<Button
Padding="12,3,12,3"
HorizontalAlignment="Center"
VerticalAlignment="Center"
Click="OnNavigateToAnotherPageButtonClick"
Content="Перейти на Page 1" />
</Grid>
</Page>
using System.Windows;
using System.Windows.Controls;
using PageNavigation.Services;
namespace PageNavigation.Pages
{
public partial class Page2 : Page
{
public Page2()
{
InitializeComponent();
}
private void OnNavigateToAnotherPageButtonClick(object sender, RoutedEventArgs e)
{
Ioc.NavigationService.NavigateToPage1();
}
}
}
using System;
using System.IO;
namespace InputOutputExample
{
class Program
{
static void Main(string[] args)
{
string inputFile = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "input.txt");
string outputFile = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "output.txt");
using var input = new StreamReader(File.OpenRead(inputFile));
Console.SetIn(input);
using var output = new StreamWriter(File.OpenWrite(outputFile));
Console.SetOut(output);
string line = null;
while ((line = Console.ReadLine()) != null)
{
Console.WriteLine(line);
}
}
}
}
Далее основной поток вызывает определенный в библиотеке MSCorEE.dll метод, который инициализирует CLR, загружает сборку EXE, а затем вызывает ее метод Main, в котором содержится точка входа. На этом процедура запуска управляемого приложения считается завершенной.
using System;
using System.Collections.Generic;
using static Numbers.NumberAlgorithm;
namespace Numbers
{
public static class NumberAlgorithm
{
public static bool AreDigitsIncreasing(int number)
{
int prevDigit = 0;
int counter = 0;
foreach (int digit in GetDigits(number))
{
if (counter != 0 && prevDigit >= digit)
{
return false;
}
++counter;
prevDigit = digit;
}
return counter > 1;
}
public static bool AreDigitsDecreasing(int number)
{
int prevDigit = 0;
int counter = 0;
foreach (int digit in GetDigits(number))
{
if (counter != 0 && prevDigit <= digit)
{
return false;
}
++counter;
prevDigit = digit;
}
return counter > 1;
}
public static IEnumerable<int> GetDigits(int source)
{
int digit = 0;
int coefficient = (int)Math.Pow(10, GetCountOfDigits(source));
do
{
source -= coefficient * digit;
coefficient /= 10;
digit = source / coefficient;
yield return digit;
} while (coefficient > 1);
}
public static int GetCountOfDigits(int number)
{
return number == 0 ? 1 : (int)Math.Ceiling(Math.Log10(Math.Abs(number) + 0.5));
}
}
class Program
{
private const string DigitsAreIncreasing = "Цифры возрастают слева направо";
private const string DigitsAreDecreasing = "Цифры понижаются слева направо";
private const string DigitsAreMixed = "Цифры не упорядочены";
static void Main(string[] args)
{
int[] numbers = { 123456789, 987654321, 2312, 0 };
for (int i = 0; i < numbers.Length; i++)
{
int number = numbers[i];
string message;
if (AreDigitsIncreasing(number))
{
message = DigitsAreIncreasing;
}
else if (AreDigitsDecreasing(number))
{
message = DigitsAreDecreasing;
}
else
{
message = DigitsAreMixed;
}
Console.WriteLine($"{(i + 1):D2}: Исходное число {number.ToString()}. {message}.");
}
Console.ReadKey();
}
}
}
using System;
namespace Types
{
public class Person
{
public string FirstName { get; set; }
public int Age { get; set; }
}
class Program
{
static void Main(string[] args)
{
// Так как class это ссылочный тип данных (Reference Type), то
// в стеке создаётся ссылка на экземпляр класса Person,
// под который выделена память в области, называемой кучей (Heap).
var person = new Person
{
FirstName = "John",
Age = 30
};
// Передаём в метод ссылку. Ссылка копируется, а данные
// так и остаются в куче, с ними ничего не происходит.
// Данных может быть хоть мегабайт, они не копируются, а вот
// ссылка копируется и имеет разный размер в зависимости от
// архитектуры x86 или x64, но размер этот крайне маленький (4 байта или 8 байт)
Display(person);
Console.ReadKey();
}
private static void Display(Person person)
{
// Здесь внутри метода находится копия ссылки.
Console.WriteLine($"Name = {person.FirstName}, Age = {person.Age.ToString()}");
}
}
}
-
// Ссылка, так как это class
Person person;
// Ссылка на экземпляр класса, так как мы выделили память в куче.
person = new Person();
using System;
namespace Types
{
class MyClass
{
MyClass my;
}
class Program
{
static void Main(string[] args)
{
// Выделяем память в куче.
// Ссылается на экземпляр класса MyClass, внутри
// которого есть поле типа MyClass со значением null.
MyClass data = new MyClass();
Console.ReadKey();
}
}
}
#pragma once
#include <string>
class Window
{
public:
Window(const std::string& fileName);
void MaximizeWindow();
private:
std::string _fileName;
};
#include "Window.h"
Window::Window(const std::string& fileName)
: _fileName(fileName) {
}
void Window::MaximizeWindow() {
// Здесь можно обратиться к полю _fileName
}