Stopwatch time = new Stopwatch();
time.Start();
var time = Stopwatch.StartNew();
private Task NetworkEfficiency()
{
return Task.Run(() => { /* Код*/ });
}
<Application
x:Class="WpfDataGrid.App"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:converters="clr-namespace:WpfDataGrid.Converters"
StartupUri="Views/MainWindow.xaml">
<Application.Resources>
<converters:BooleanToBrushConverter x:Key="BooleanToBrushConverter" />
</Application.Resources>
</Application>
using System.Collections.ObjectModel;
using System.Windows;
using WpfDataGrid.ViewModels;
namespace WpfDataGrid.Views
{
public partial class MainWindow : Window
{
public ObservableCollection<ItemViewModel> Collection { get; }
public MainWindow()
{
Collection = new ObservableCollection<ItemViewModel>();
for (int i = 0; i < 10; i++)
{
Collection.Add(new ItemViewModel((i + 1).ToString()));
}
InitializeComponent();
}
private void OnDeleteButtonClick(object sender, RoutedEventArgs e)
{
for (int i = 0; i < Collection.Count; i++)
{
if (Collection[i].IsChecked)
{
Collection.RemoveAt(i);
--i;
}
}
}
}
}
using GalaSoft.MvvmLight;
namespace WpfDataGrid.ViewModels
{
public class ItemViewModel : ViewModelBase
{
private bool _isChecked;
private string _title;
public bool IsChecked
{
get { return _isChecked; }
set { Set(ref _isChecked, value); }
}
public string Title
{
get { return _title; }
set { Set(ref _title, value); }
}
public ItemViewModel(string title)
{
_title = title;
}
}
}
using System;
using System.Globalization;
using System.Windows.Data;
using System.Windows.Media;
namespace WpfDataGrid.Converters
{
[ValueConversion(typeof(bool), typeof(SolidColorBrush))]
public class BooleanToBrushConverter : IValueConverter
{
public SolidColorBrush TrueBrush { get; set; } = new SolidColorBrush(Colors.Tomato);
public SolidColorBrush FalseBrush { get; set; } = new SolidColorBrush(Colors.CornflowerBlue);
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
return (bool)value ? TrueBrush : FalseBrush;
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
return Binding.DoNothing;
}
}
}
Notifier notifier = new Notifier(cfg =>
{
cfg.PositionProvider = new WindowPositionProvider(
parentWindow: ССЫЛКА_НА_ДРУГОЕ_ОКНО,
corner: Corner.TopRight,
offsetX: 10,
offsetY: 10);
cfg.LifetimeSupervisor = new TimeAndCountBasedLifetimeSupervisor(
notificationLifetime: TimeSpan.FromSeconds(3),
maximumNotificationCount: MaximumNotificationCount.FromCount(5));
cfg.Dispatcher = Application.Current.Dispatcher;
});
Не нужно от них избавляться. Если это нажатие на кнопку, там ему самое место, просто нужно или залогировать информацию об ошибке, или вывести информацию на экран (или всё вместе). Если бы он в классе с алгоритмом подавлял ошибки, то да, это было бы не то что неподдерживающийся хаос, это просто был бы нерабочий код, который нельзя так писать. Проще говоря, если не будет трай кэтча в методе нажатия на кнопку, то приложение будет просто крашиться. Мы же можем приложение не крашить, а просто завершить выполнение работы не получив результат. В таком случае, имея логи, можно разобраться в проблеме. Бывают ошибки, не связанные с алгоритмом, например, антивирус заблокировал файл, не удалось его открыть и прочитать. У меня такое было.