Archiwum dla Styczeń, 2013

WPF czasami sprawy ułatwia, a czasami utrudnia. Bez wątpienia jest jednak ładny 🙂

Dzisiaj chciałbym pokazać jak zrobić prosty dialog, który wywołujemy w programie aby umożliwić użytkownikowi wpisanie jakiegoś tekstu. Setki razy realizowałem takie zadanie w MFC czy WindowsForms – dziś czas na WPF.

Samo wywołanie dialogu nie różni się znacząco od innych technologii. Tworzymy instancję klasy dialogu i wywołujemy „ShowDialog”:

ManualAddFunction dlg = new ManualAddFunction();
dlg.ShowDialog();

Pobranie informacji w jaki sposób użytkownik zakończył dialog (OK, CANCEL) jest już bardziej złożone. Bowiem jako wynik uzyskujemy nie tyle „czystego” bool-a, co ?bool – w praktyce oznacza to że dialog może mieć stan nie określony (ni true ni false) – co wymaga od nas sprawdzenia czy w ogóle występuje jakaś odpowiedź i jeżeli tak, to dopiero możemy sprawdzić jej stan:

if (dlg.DialogResult.HasValue && dlg.DialogResult.Value)

Od strony klasy okienka reakcja na wciśnięcie klawisza „OK” może wyglądać następująco:

DialogResult = true;
Close();

No dobra. Ale jak skojarzyć kontrolkę z danymi i w końcu jak ją pobrać ? WPF i mechanizm DataBinding (łączenie kontrolki z danymi) jest tu jak najbardziej pomocny, ponieważ umożliwia ograniczenie ilości obsługiwanych zdarzeń i pozwala „flakom” .NET na zrobienie roboty za nas. W kodzie programu musimy stworzyć „property” które powiążemy z XAML i przez które pobierzemy dane z zewnątrz dialogu. Najprościej tak:

public string Label { get; set; }

Musimy jeszcze powiązać XAML z klasą (wskazać źródło danych). Możemy w konstruktorze zrobić to jedną linijką (główny grid okienka jest w XAML nazwany grud1):

grid1.DataContext = this;

i powiązać nasz textbox z własnością klasy po stronie XAML np. w następujący sposób:

TextBox Text="{Binding Path=FunctionGroup}"



Język c# na platformę .NET to potężne narzędzie, które z założenia ma ułatwić życie programiście i pozwolić bardziej skoncentrować się na meritum realizowanego zagadnienia. Ale do wykorzystania tych możliwości potrzeba sporo wiedzy i doświadczenia.

Ostatnio, analizując kod, znalazłem ciekawą klasę, ułatwiającą pomiar czasu wykonania danego fragmentu programu w sposób niesamowicie prosty i intuicyjny. Nie trzeba nic liczyć – po prostu w odpowiednim momencie wywołać metody na zainicjowanie i zakończenie liczenia:

using System.Diagnostics;
.....
Stopwatch stopwatch = new Stopwatch();
stopwatch.Start();
double res=0.0;
for (int x = 0; x < 10000; x++)
 for (int y = 0; y < 10000; y++)
  res += x * y;
stopwatch.Stop();
MessageBox.Show("Loop time in milliseconds: "+ stopwatch.ElapsedMilliseconds.ToString());