Screen.FromControl()
, Screen.FromHandle()
и пр. Или можно использовать свойство AllScreens, хранящее все мониторы системы. <ListBox ItemsSource="{Binding DevList}" SelectedItem="{Binding SelectedElement}" />
<GroupBox DataContext="{Binding SelectedElement}">
</GroupBox>
<GroupBox DataContext="{Binding SelectedElement.Subelement1}">
</GroupBox>
cancellationToken.IsCancellationRequested
. Если в воркере используется цикл, то проверять можно в каждой итерации.var formWait = new FormWait(cancellationToken =>
{
foreach(var item in _items)
{
if (cancellationToken.IsCancellationRequested)
{
return;
}
item.DoWork();
}
});
wait.Stop = delegate ()
{
var source = _tokenSource;
if (source != null)
{
source.Cancel();
source.Dispose();
_tokenSource = null;
}
};
myThread.Start();
В форме:
public Action<CancellationToken> Worker { get; } // добавляем ссылку на токен останова
public Action Stop { get; set; }
private CancellationTokenSource _tokenSource;
public FormWait(Action<CancellationToken> worker)
{
InitializeComponent();
if (worker == null)
throw new ArgumentNullException();
Worker = worker;
}
protected override void OnLoad(EventArgs e)
{
base.OnLoad(e);
_tokenSource?.Dispose();
_tokenSource = new CancellationTokenSource();
var cancellationToken = = _tokenSource.Token;
Task.Factory.StartNew(() => Worker(cancellationToken ))
.ContinueWith(t => { this.Close(); }, TaskScheduler.FromCurrentSynchronizationContext());
}
private void button1_Click(object sender, EventArgs e)
{
Console.WriteLine("Stop");
Stop();
}
public Func<CancellationToken, bool> Worker { get; }
Task.Factory.StartNew<bool>(() => Worker(cancellationToken))
.ContinueWith(t => { if (t.Result) this.Close(); }, TaskScheduler.FromCurrentSynchronizationContext());
namespace DelegateDemo
{
public delegate string DemoDel(string s);
class Program
{
static void Main(string[] args)
{
ParamMethod(DelLink); // передача ссылки на метод DelLink в ParamMethod
ParamMethod(s => "(" + s + ")"); // передача анонимной функции в ParamMethod
Console.ReadKey();
}
static bool ParamMethod(DemoDel d)
{
if(d("что угодно") == "2")
{
Console.WriteLine("делегат вернул 2");
}
if(d("5") == "(5)" && d("100500") == "(100500)")
{
Console.WriteLine("делегат обернул число в скобки");
}
}
static string DelLink(string s)
{
return "2";
}
}
}
var testFiles = Directory.EnumerateFiles(solutionDirectory + @"\samples");
var sortedTestFiles1 = testFiles.OrderBy(x => x, new NaturalComparer());
// или
var sortedTestFiles2 = testFiles.ToList();
sortedTestFiles2.Sort(new NaturalComparer());
/// <summary>
/// Натуральное сравнение строк
/// </summary>
public class NaturalComparer : IComparer<string>
{
/// <summary>
/// Вызов WinApi-функции для натурального сравнения строк
/// </summary>
[DllImport("shlwapi.dll", CharSet = CharSet.Unicode)]
private static extern int StrCmpLogicalW(string psz1, string psz2);
/// <summary>
/// Натуральное сравнение строк
/// </summary>
/// <param name="x">Первая строка</param>
/// <param name="y">Вторая строка</param>
/// <returns>Сравнивает две строки, возвращая -1, 0 или 1</returns>
public static int Compare(string x, string y)
{
return StrCmpLogicalW(x, y);
}
/// <summary>
/// Натуральное сравнение строк
/// </summary>
/// <param name="x">Первая строка</param>
/// <param name="y">Вторая строка</param>
/// <returns>Сравнивает две строки, возвращая -1, 0 или 1</returns>
int IComparer<string>.Compare(string x, string y)
{
return StrCmpLogicalW(x, y);
}
}
public readonly List<Meetings> MeetingsList = new List<Meetings>();
Meetings meet
, потому что переменная с именем meet уже есть. Если ошибка здесь не возникает, то, скорее всего, в какой-то из двух имён вместо английской "e" стоит русская "е". return (from e in db.Position
.Include(p => p.Operations.Select(o => o.Transition.Select(t => t.RiggingTransition)))
.Include(p => p.Operations.Select(o => o.MaterialOperation))
where ...
select e).ToList();
<Window x:Class="TestApp.MainWindow"
xmlns:testApp="clr-namespace:TestApp"
Title="MainWindow" Height="350" Width="525">
<Window.Resources>
<DataTemplate DataType="{x:Type testApp:TestInt}">
<TextBlock Text="{Binding Value}" Background="Red"/>
</DataTemplate>
<DataTemplate DataType="{x:Type testApp:TestStr}">
<TextBlock Text="{Binding Value}" Background="Yellow"/>
</DataTemplate>
</Window.Resources>
<StackPanel>
<ContentControl Content="{Binding Test1}"/>
<ContentControl Content="{Binding Test2}"/>
<ListBox ItemsSource="{Binding TestList}"/>
</StackPanel>
</Window>
public class TestInt
{
public int Value { get; set; }
}
public class TestStr
{
public string Value { get; set; }
}
public partial class MainWindow : Window
{
public TestInt Test1 { get; set; }
public TestStr Test2 { get; set; }
public List<object> TestList { get; set; }
public MainWindow()
{
InitializeComponent();
DataContext = this;
Test1 = new TestInt { Value = 123 };
Test2 = new TestStr { Value = "asd" };
TestList = new List<object> { Test1, Test2 };
}
class TestClass
{
private int _a;
public int A
{
get { return _a; }
set { _a = value; }
}
public int B { get; set; }
}
var testClass = typeof(TestClass);
var fields = testClass.GetFields(BindingFlags.NonPublic | BindingFlags.Instance);
foreach (var fieldInfo in fields)
{
Console.WriteLine(fieldInfo.Name);
}
// результат:
// _a
// <B>k__BackingField
class A { public virtual void Print() { Console.WriteLine("A"); } }
class B : A { public override void Print() { Console.WriteLine("B"); } }
class C : B { public new virtual void Print() { Console.WriteLine("C"); } }
class D : C { public override void Print() { Console.WriteLine("D"); } }
A ad = new D();
ad.Print(); // покажет B
str.IndexOfAny(new []{'+', '-', '*', '/'})
, который вернёт индекс символа операции.Parse
берёт строку и возвращает число (возможно, будет исключение). Convert.ToInt16
имеет много вариантов, в зависимости от типа аргумента. Конкретно Convert.ToInt16(string)
вызывает Int16.Parse(value, CultureInfo.CurrentCulture)
, то есть, абсолютно нет разницы с Parse
(в том числе, возникнет исключение, если строка не является числом). public class Item : BaseViewModel
{
private string _name;
public string Name
{
get => _name;
set
{
_name = value;
RaisePropertyChanged();
}
}
private int _itemMode;
public int ItemMode
{
get => _itemMode;
set
{
_itemMode = value;
RaisePropertyChanged();
}
}
}
public class ItemsList
{
public ObservableCollection<Item> Items { get; } = new ObservableCollection<Item>
{
new Item { Name = "Один", ItemMode = 1 },
new Item { Name = "Два", ItemMode = 2 },
new Item { Name = "Три", ItemMode = 3 },
};
}
<Grid>
<Grid.Resources>
<converters:IntToBoolConverter x:Key="IntToBoolConverter"/>
<DataTemplate DataType="{x:Type viewModels:Item}">
<Border x:Name="Data">
<Grid x:Name="ContentBase" Margin="1,0">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto"/>
<ColumnDefinition/>
<ColumnDefinition/>
<ColumnDefinition/>
</Grid.ColumnDefinitions>
<Label Name="DisplayText" Grid.Column="0" Content="{Binding Name}"/>
<RadioButton Name="_1" Grid.Column="1" Content="1"
IsChecked="{Binding ItemMode, Converter={StaticResource IntToBoolConverter}, ConverterParameter=1}"/>
<RadioButton Name="_2" Grid.Column="2" Content="2"
IsChecked="{Binding ItemMode, Converter={StaticResource IntToBoolConverter}, ConverterParameter=2}"/>
<RadioButton Name="_3" Grid.Column="3" Content="3"
IsChecked="{Binding ItemMode, Converter={StaticResource IntToBoolConverter}, ConverterParameter=3}"/>
</Grid>
</Border>
</DataTemplate>
</Grid.Resources>
<Grid.DataContext>
<viewModels:ItemsList/>
</Grid.DataContext>
<ListBox ItemsSource="{Binding Items}"/>
</Grid>
public class BaseViewModel : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
protected virtual void RaisePropertyChanged([CallerMemberName] string propertyName = null)
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
}
public class IntToBooleanConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
return value != null
&& parameter != null
&& value.ToString() == parameter.ToString();
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
if (value == null || parameter == null) return Binding.DoNothing;
int result;
if ((bool)value && int.TryParse(parameter.ToString(), out result))
{
return result;
}
return Binding.DoNothing;
}
}