|
|
Questions and answers for Concepts Freezable Object.
|
8. Concepts Freezable Object
|
| 8.1 What is a
Freezable?
|
| 8.2 How can I
determine whether a Freezable Is Frozen?
|
| 8.3 How can I
obtain a writable copy of a Read-Only Freezable?
|
8.1 What is a Freezable?
|
|
The following example shows an application definition file. The application
definition file defines a resource section (a value for the Resources
property). Resources defined at the application level can be accessed by all
other pages that are part of the application. In this case, the resource is a
declared style. Because a complete style that includes a control template can
be lengthy, this example omits the control template that is defined within the
"ContentTemplate" property setter of the style.
|
[XAML]
<Application.Resources>
<Style TargetType="Button" x:Key="GelButton" >
<Setter Property="Margin" Value="1,2,1,2"/>
<Setter Property="HorizontalAlignment" Value="Left"/>
<Setter Property="Template">
<Setter.Value>
...
</Setter.Value>
</Setter>
</Style>
</Application.Resources>
|
|
The following example shows an XAML page that references the application level
resource that the previous example defined. The resource is referenced by using
a StaticResource Markup Extension that specifies the unique resource key for
the requested resource. No resource with the key of "GelButton" is found in the
current page, so the resource lookup scope for the requested resource continues
beyond the current page and into the defined application level resources.
|
[XAML]
<StackPanel
Name="root"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<Button Height="50" Width="250" Style="{StaticResource
GelButton}" Content="Button 1" />
<Button Height="50" Width="250" Style="{StaticResource
GelButton}" Content="Button 2" />
</StackPanel>
|
8.2 How can I determine whether a Freezable Is Frozen?
|
|
This example shows how to determine whether a Freezable object is frozen. If you
try to modify a frozen Freezable object, it throws an 'Invalid Operation'
Exception. To avoid throwing this exception, use the "IsFrozen" property of the
Freezable object to determine whether it is frozen.
|
[C#]
Button myButton = new Button();
SolidColorBrush myBrush = new SolidColorBrush(Colors.Yellow);
if (myBrush.CanFreeze)
{
// Makes the brush unmodifiable.
myBrush.Freeze();
}
myButton.Background = myBrush;
if (myBrush.IsFrozen) // Evaluates to true.
{
// If the brush is frozen, create a clone and
// modify the clone.
SolidColorBrush myBrushClone = myBrush.Clone();
myBrushClone.Color = Colors.Red;
myButton.Background = myBrushClone;
}
else
{
// If the brush is not frozen,
// it can be modified directly.
myBrush.Color = Colors.Red;
|
|
|
8.3 How can I obtain a writable copy of a Read-Only Freezable?
|
|
This example shows how to use the Clone method to create a writable copy of a
read-only Freezable. After a Freezable object is marked as read-only
("frozen"), you cannot modify it. However, you can use the 'Clone' method to
create a modifiable clone of the frozen object.
The following example creates a modifiable clone of a frozen 'SolidColorBrush'
object.
|
[C#]
Button myButton = new Button();
SolidColorBrush myBrush = new SolidColorBrush(Colors.Yellow);
|
|
|
[C#]
// Freezing a Freezable before it provides
// performance improvements if you don't
// intend on modifying it.
if (myBrush.CanFreeze)
{
// Makes the brush unmodifiable.
myBrush.Freeze();
}
myButton.Background = myBrush;
// If you need to modify a frozen brush,
// the Clone method can be used to
// create a modifiable copy.
SolidColorBrush myBrushClone = myBrush.Clone();
// Changing myBrushClone does not change
// the color of myButton, because its
// background is still set by myBrush.
myBrushClone.Color = Colors.Red;
// Replacing myBrush with myBrushClone
// makes the button change to red.
myButton.Background = myBrushClone;
|
|