Tym razem krótko, o czymś co może się przydać nie tylko na egzaminie, ale także w codziennej pracy z zasobami i bindowaniem do nich.
Rozważmy cztery przypadki bindowania do zasobów w kodzie.
Kod wyjściowy dla wszystkich przypadków:
Code:
<Window x:Class="DynamicStatic.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">
<Window.Resources>
<SolidColorBrush x:Key="Background" Color="Blue" />
<SolidColorBrush x:Key="Foreground" Color="Red" />
</Window.Resources>
<Grid>
<Grid.RowDefinitions>
<RowDefinition />
<RowDefinition Height="30" />
</Grid.RowDefinitions>
<Button Content="Przycisk"></Button>
<Button Name="btnDoSomething" Content="Wykonaj" Grid.Row="1" Click="BtnDoSomething_OnClick" />
</Grid>
</Window>
Dwa zasoby dla tła i koloru czcionki, będziemy przypisywać do przycisku, a następnie w kodzie pobierzemy i zmienimy ich wartość. Zmieniać będzie się tylko definicja klawisza i metody podpiętej pod zdarzenie drugiego klawisza.
1. Przypisanie statyczne i zmiana koloru pędzla:
Code:
<Button Background="{StaticResource Background}" Foreground="{StaticResource Foreground}" Content="Przycisk"></Button>
private void BtnDoSomething_OnClick(object sender, RoutedEventArgs e)
{
var background = (SolidColorBrush)this.FindResource("Background");
background.Color = Colors.Yellow;
var foreground = (SolidColorBrush)this.FindResource("Foreground");
foreground.Color = Colors.Black;
}
Efekt? Zmiana kolorów:
2. Przypisanie statyczne i zmiana pędzla:
Różnica polega na zmianie pędzla - czyli podmieniamy cały obiekt zasobów (XAML definiujący przycisk nie zmienia się):
Code:
private void BtnDoSomething_OnClick(object sender, RoutedEventArgs e)
{
this.Resources["Background"] = new SolidColorBrush(Colors.Yellow);
this.Resources["Foreground"] = new SolidColorBrush(Colors.Black);
}
Efekt?
Właściwie w tym przypadku możemy mówić o braku jakiegokolwiek efektu. Dzieje się tak dlatego, że statyczny zasób pobierany jest tylko raz. Obiekt pędzla został pobrany i nie zmienia się, jednak jeżeli zmienimy właściwość - zobaczymy efekt (dotyczy to pierwszego przykładu).
3. Przypisanie dynamiczne i zmiana koloru pędzla
Code:
<Button Background="{DynamicResource Background}" Foreground="{DynamicResource Foreground}" Content="Przycisk"></Button>
private void BtnDoSomething_OnClick(object sender, RoutedEventArgs e)
{
((SolidColorBrush) this.Resources["Background"]).Color = Colors.Yellow;
((SolidColorBrush)this.Resources["Foreground"]).Color = Colors.Black;
}
Efekt:
4. Przypisanie dynamiczne i zmiana pędzla
Kod XAML przycisku taki jak poprzednio
Code:
private void BtnDoSomething_OnClick(object sender, RoutedEventArgs e)
{
this.Resources["Background"] = new SolidColorBrush(Colors.Yellow);
this.Resources["Foreground"] = new SolidColorBrush(Colors.Black);
}
Efekt:
Warto zapamiętać te przypadki i wiedzieć w jaki sposób są pobierane zasoby, gdyż możemy dzięki temu uniknąć częstych błędów.
Brak komentarzy:
Prześlij komentarz