Plik zawiera kody do nauki. Objaśnienia na temat, gdzie należy umieścić poszczególne 
fragmenty kodu zawarte są w podręczniku Kempa A. "Wprowadzenie do WPF. 
Tworzenie aplikacji WPF przy użyciu XAML i C#", Helion, Gliwice 2017
***************************************************************************
Rozdział 10. Zasoby, style i wyzwalacze
***************************************************************************

===========================================================================
10.2 Zasoby logiczne
===========================================================================

Testujemy zasoby (wersja 1)
---------------------------------------------------------------------------

<Grid>
    <WrapPanel>
        <Button Content="Potwierdź" Margin="10" Padding="10"/>
        <Button Content="Drukuj" Margin="10" Padding="10" />
        <Button Content="Zapisz" Margin="10" Padding="10" />
        <Button Content="Anuluj" Margin="10" Padding="10"/>
        <Button Content="Powrót" Margin="10" Padding="10"/>
    </WrapPanel>
</Grid>

Gradientowe tło dla jednego z przycisków:

<Button Content="Potwierdź" Margin="10" Padding="10">
    <Button.Background>
        <LinearGradientBrush StartPoint="0.5,0" EndPoint="0.5,1">
            <GradientStop Color="White" Offset="0"/>
            <GradientStop Color="LightBlue" Offset="1"/>
        </LinearGradientBrush>
    </Button.Background>
</Button>

Testujemy zasoby (wersja 2)
---------------------------------------------------------------------------

Kod dla zasobu:

<Window.Resources>
    <LinearGradientBrush x:Key="tloPrzyciskow" StartPoint="0.5,0" EndPoint="0.5,1">
        <GradientStop Color="White" Offset="0"/>
        <GradientStop Color="LightBlue" Offset="1"/>
    </LinearGradientBrush>
</Window.Resources>

Definicja przycisków:

<Button Content="Potwierdź" Background="{StaticResource tloPrzyciskow}" Margin="10" Padding="10"/>
<Button Content="Drukuj" Background="{StaticResource tloPrzyciskow}" Margin="10" Padding="10"/>
<Button Content="Zapisz" Background="{StaticResource tloPrzyciskow}" Margin="10" Padding="10"/>
<Button Content="Anuluj" Background="{StaticResource tloPrzyciskow}" Margin="10" Padding="10"/>
<Button Content="Powrót" Background="{StaticResource tloPrzyciskow}" Margin="10" Padding="10"/>

Testujemy zasoby (wersja 3)
---------------------------------------------------------------------------
<Grid>
    <Grid.RowDefinitions>
        <RowDefinition Height="Auto"/>
        <RowDefinition Height="Auto"/>
    </Grid.RowDefinitions>
    <Grid.ColumnDefinitions>
        <ColumnDefinition Width="Auto"/>
    </Grid.ColumnDefinitions>
    <WrapPanel Grid.Row="0" Grid.Column="0">
        <WrapPanel.Resources>
            <LinearGradientBrush x:Key="tloPrzyciskow" StartPoint="0.5,0" EndPoint="0.5,1">
                <GradientStop Color="White" Offset="0"/>
                <GradientStop Color="LightBlue" Offset="1"/>
            </LinearGradientBrush>
        </WrapPanel.Resources>
        <Button Content="Potwierdź" Background="{StaticResource tloPrzyciskow}" Margin="10" Padding="10"/>
        <Button Content="Drukuj" Background="{StaticResource tloPrzyciskow}" Margin="10" Padding="10"/>
        <Button Content="Zapisz" Background="{StaticResource tloPrzyciskow}" Margin="10" Padding="10"/>
        <Button Content="Anuluj" Background="{StaticResource tloPrzyciskow}" Margin="10" Padding="10"/>
        <Button Content="Powrót" Background="{StaticResource tloPrzyciskow}" Margin="10" Padding="10"/>
    </WrapPanel>
    <Button Grid.Row="1" Grid.Column="0" Content="Nowy Przycisk" Margin="10" Padding="10"/>
</Grid>

Testujemy zasoby (wersja 4)
---------------------------------------------------------------------------
Definicja zasobu:

<Window.Resources>
    <LinearGradientBrush x:Key="tloPrzyciskow" StartPoint="0.5,0" EndPoint="0.5,1">
        <GradientStop Color="White" Offset="1"/>
        <GradientStop Color="LightGray" Offset="0"/>
    </LinearGradientBrush>
</Window.Resources>

Definicja nowego przycisku z odwołaniem do zasobu:

<Button Grid.Row="1" Grid.Column="0" Content="Nowy Przycisk" Background="{StaticResource tloPrzyciskow}" Margin="10" Padding="10"/>

===========================================================================
10.3 Style
===========================================================================

Testujemy style (wersja 1)
---------------------------------------------------------------------------
<Grid>
    <WrapPanel>
        <WrapPanel.Resources>
            <Style x:Key="stylPrzyciskow">
                <Setter Property="Button.Margin" Value="10"/>
                <Setter Property="Button.Padding" Value="10"/>
                <Setter Property="Button.FontSize" Value="12"/>
                <Setter Property="Button.FontWeight" Value="Bold"/>
                <Setter Property="Button.FontStyle" Value="Italic"/>
                <Setter Property="Button.BorderBrush" Value="Black"/>
                <Setter Property="Button.BorderThickness" Value="2"/>
                <Setter Property="Button.Background">
                    <Setter.Value>
                        <LinearGradientBrush StartPoint="0.5,0" EndPoint="0.5,1">
                            <GradientStop Color="White" Offset="0"/>
                            <GradientStop Color="Gray" Offset="1"/>
                        </LinearGradientBrush>
                    </Setter.Value>
                </Setter>
            </Style>
        </WrapPanel.Resources>
        <Button Content="Potwierdź" Style="{StaticResource stylPrzyciskow}"/>
        <Button Content="Drukuj" Style="{StaticResource stylPrzyciskow}"/>
        <Button Content="Usuń" Style="{StaticResource stylPrzyciskow}"/>
        <Button Content="Zapisz" Style="{StaticResource stylPrzyciskow}"/>
        <Button Content="Anuluj" Style="{StaticResource stylPrzyciskow}"/>
        <Button Content="Powrót" Style="{StaticResource stylPrzyciskow}"/>
    </WrapPanel>
</Grid>

Testujemy style (wersja 2)
---------------------------------------------------------------------------
<Grid>
    <WrapPanel>
        <WrapPanel.Resources>
            <Style x:Key="stylElementow">
                <Setter Property="Control.Margin" Value="10"/>
                <Setter Property="Control.Padding" Value="10"/>
                <Setter Property="Control.FontSize" Value="12"/>
                <Setter Property="Control.FontWeight" Value="Bold"/>
                <Setter Property="Control.FontStyle" Value="Italic"/>
                <Setter Property="Control.BorderBrush" Value="Black"/>
                <Setter Property="Control.BorderThickness" Value="2"/>
                <Setter Property="Control.Background">
                    <Setter.Value>
                        <LinearGradientBrush StartPoint="0.5,0" EndPoint="0.5,1">
                            <GradientStop Color="White" Offset="0"/>
                            <GradientStop Color="Gray" Offset="1"/>
                        </LinearGradientBrush>
                    </Setter.Value>
                </Setter>
            </Style>
        </WrapPanel.Resources>
        <Button Content="Przycisk" Style="{StaticResource stylElementow}"/>
        <TextBox Text="Pole tekstowe" Style="{StaticResource stylElementow}"/>
        <TextBlock Text="TextBlock. A tu nie ma tła zdefiniowanego w stylu" Style="{StaticResource stylElementow}"/>
    </WrapPanel>
</Grid>

Przykład prezentujący możliwość anulowania niejawnego przypisania stylu dla danego typu 
---------------------------------------------------------------------------
<Window.Resources>
    <Style TargetType="{x:Type TextBox}">
         <Setter Property="Foreground" Value="Blue"/>
    </Style>
</Window.Resources>

<StackPanel>
    <TextBox Text="Wpisz imię..." />
    <TextBox Text="Wpisz nazwisko..." />
    <TextBox Style="{x:Null}" Text="Wpisz numer..." />
</StackPanel>

Przykład z zastosowaniem właściwości zależnych
---------------------------------------------------------------------------

<Window x:Class="WlasciwosciZalezne.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525" FontSize="25" FontWeight="Bold">
    <StackPanel>
        <TextBlock Text="Potwierdź lub anuluj" FontSize="15"/>
        <WrapPanel>
            <Button Content="Zapisz" Margin="10"/>
            <Button Content="Anuluj" Margin="10"/>
        </WrapPanel>
    </StackPanel>
</Window>

===========================================================================
10.4 Wyzwalacze
===========================================================================

Wyzwalacze właściwości
--------------------------------------------------------------------------

<Window.Resources>
    <Style TargetType="{x:Type TextBlock}">
        <Setter Property="FontSize" Value="20"/>
        <Setter Property="Foreground" Value="Blue"/>
        <Style.Triggers>
            <Trigger Property="IsMouseOver" Value="True">
                <Setter Property="FontSize" Value="30"/>
                <Setter Property="Foreground" Value="Green"/>
                <Setter Property="FontWeight" Value="Bold"/>
            </Trigger>
        </Style.Triggers>
    </Style>
</Window.Resources>

<StackPanel>
     <TextBlock Text="Testujemy wyzwalacz"/>
</StackPanel>

Wyzwalacze danych
--------------------------------------------------------------------------
Styl dla Rectangle:

<StackPanel>
    <StackPanel.Resources>
        <Style x:Key="stylKwadrat" TargetType="Rectangle">
            <Setter Property="Margin" Value="10"/>
            <Setter Property="Fill" Value="LightBlue"/>
            <Setter Property="Width" Value="30"/>
            <Setter Property="Height" Value="30"/>
            <Style.Triggers>
                <DataTrigger Binding="{Binding ElementName=cbOn, Path=IsChecked}" Value="True">
                    <Setter Property="Fill" Value="Red" />
                    <Setter Property="Width" Value="50"/>
                    <Setter Property="Height" Value="50"/>
                </DataTrigger>
            </Style.Triggers>
        </Style>
    </StackPanel.Resources>
    <CheckBox x:Name="cbOn" Content="Zmień kolor i rozmiar" Margin="5"/>
    <Rectangle Style="{StaticResource stylKwadrat}"/>
</StackPanel>


Drugi styl (dla pola tekstowego):

<Style x:Key="stylPolaTekstowego" TargetType="TextBox">
    <Setter Property="MaxLength" Value="11"/>
    <Setter Property="Width" Value="80"/>
    <Setter Property="Background" Value="LightPink"/>
    <Style.Triggers>
        <DataTrigger Binding="{Binding RelativeSource={RelativeSource Self}, Path=Text.Length}" Value="11">
            <Setter Property="Background" Value="White"/>
        </DataTrigger>
    </Style.Triggers>
</Style>


Pole tekstowe:

<WrapPanel>
    <Label Content="Wpisz nr PESEL"/>
    <TextBox Style="{StaticResource stylPolaTekstowego}"/>
</WrapPanel>

Modyfikacja kodu z podrozdziału 7.2:

<Style TargetType="{x:Type TextBlock}">
    <Setter Property="HorizontalAlignment" Value="Right" />
    <Style.Triggers>
        <DataTrigger Binding="{Binding Path=LiczbaSztuk}" Value="0">
            <Setter Property="Foreground" Value="Red"/>
            <Setter Property="FontWeight" Value="Bold"/>
        </DataTrigger>
    </Style.Triggers>
</Style> 

Warunki logiczne w wyzwalaczach
--------------------------------------------------------------------------
Alternatywa:

<Style TargetType=" {x:Type TextBlock} ">
    <Setter Property="HorizontalAlignment" Value="Right" />
    <Style.Triggers>
        <DataTrigger Binding="{Binding Path=LiczbaSztuk}" Value="0">
            <Setter Property="Foreground" Value="Red"/>
            <Setter Property="FontWeight" Value="Bold"/>
        </DataTrigger>
        <DataTrigger Binding="{Binding Path=LiczbaSztuk}" Value="1">
            <Setter Property="Foreground" Value="Red"/>
            <Setter Property="FontWeight" Value="Bold"/>
        </DataTrigger>
    </Style.Triggers>
</Style>

Koniunkcja:

<Style TargetType="{x:Type TextBlock}">
    <Setter Property="HorizontalAlignment" Value="Right" />
    <Style.Triggers>
        <MultiDataTrigger>
            <MultiDataTrigger.Conditions>
                <Condition Binding="{Binding Path=LiczbaSztuk}" Value="0"/>
                <Condition Binding="{Binding Path=Magazyn}" Value="Katowice 1"/>
            </MultiDataTrigger.Conditions>
            <Setter Property="Foreground" Value="Red"/>
            <Setter Property="FontWeight" Value="Bold"/>
        </MultiDataTrigger>
    </Style.Triggers>
</Style>



