sobota, 20 lutego 2010

WPF w praktyce


Kilka praktycznych porad dal osób dopiero zaczynających przygodę z WPF.

1. Kontrolka RichTextBox
a) pobieranie zawartości kontrolki
Jeśli ktoś korzystał wcześniej z WindowsForms i pobranie zawartości tekstu znajdującego się wewnątrz kontrolki RichTextBox nie sprawiało mu problemów (właściwość Text) to w przypadku WPF może nie być już to takie jasne.
WPF wykorzystuje nowy model "zawartości" i aby pobrać text z naszej kontrolki możemy skorzystać z poniższego kodu:

TextRange textRange = new TextRange(rtb.Document.ContentStart, rtb.Document.ContentEnd);
string s = textRange.Text;
 
b) programowe dodawanie tekstu
Także dodawanie tekstu "z kodu" nie jest takie oczywiste jak w WindowsForms:
 
            FlowDocument flowDocument = new FlowDocument();
            Paragraph para = new Paragraph();
            para.Inlines.Add("Text to add");
            flowDocument.Blocks.Add(para);
            rtb.Document = flowDocument;
Jak więc widać, aby dodać tekst należy najpierw stworzyć obiekt klasy FlowDocument oraz Paragraph. Następnie do kolekcji Inlines Paragraphu dodajemy tekst który chcemy ujrzeć w kontrolce. Na końcu do kolekcji Blocks FlowDocumentu dodajemy nasz paragraf i ostatecznie przypisujemy właściwości Document RichTextBoxa obiekt FlowDocument.

c) wczytywanie danych z pliku
Jak się domyślacie także i ta sprawa nie jest od początku taka oczywista :). W WinForms kontrolka posiadała wygodną metodę LoadFile() która pozwalała określić np. ścieżkę z której można załadować plik. W WPF należy skorzystać bezpośrednio ze strumienia:
 
            System.Windows.Forms.OpenFileDialog ofd = new System.Windows.Forms.OpenFileDialog();
            ofd.InitialDirectory = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments);
            ofd.Filter = "Plik textowy (*.txt)|*.txt";
            ofd.RestoreDirectory = true;
            if (ofd.ShowDialog() == System.Windows.Forms.DialogResult.OK)
            {
                string fileName = ofd.FileName;
                TextRange textRange = new TextRange(rtbToChange.Document.ContentStart, rtbToChange.Document.ContentEnd);
                System.IO.FileStream fs = new System.IO.FileStream(fileName, System.IO.FileMode.Open);
                textRange.Load(fs, System.Windows.DataFormats.Text);
                fs.Close();
            }
Skorzystałem tutaj z wygodnego (jak mi się wydaje) OpenFileDialoga znajdującego się w Windows.Forms (można także tutaj skorzystać z OpenFileDialog znajdującego się w System.Win32). Następnie postępujemy jak przy obsłudze większości plików:
1. Otwieramy plik
2. Tworzymy obiekt TextRange któremu przekazujemy granice dokumentu
3. Korzystamy z metody Load(IO.Stream, dataFormat) która wczytuje tekst do RichTextBoxa ze strumienia
4. Po zakończeniu pracy z plikiem zamykamy go.

2. Button
Problem także nie ominął mnie także w kwestii zwykłego przycisku. Znana właściwość z WinForms FlatStyle: Flat, nie występuje w WPFowskiej kontrolce Button. Aby nadać płaski styl przyciskowi można użyć poniżeszego kodu:

Style="{StaticResource {x:Static ToolBar.ButtonStyleKey}}

Powyższą linijkę wstawiamy bezpośrednio do kodu XAML podczas deklaracji Buttona.

Podsumowując:
WPF przez swoją innowacyjność wymaga poznania nowych mechanizmów, które niekiedy ułatwiają a niekiedy utrudniają pracę programiście :)

Brak komentarzy:

Prześlij komentarz