by
kirupa | 19 November 2007
In the
previous page,
you were promised that you would learn how to use
your user control. While technically you did learn
how to use your control, realistically, because of
the extra functionality our user control has, we
didn't get to use our user control to its full
potential.
When editing your user control by having
InfoRectangle.xaml
open in Blend, you have access to
all of your user control's nested controls and their
properties. When you place your user control
somewhere else - such as Window1.xaml - you no
longer have direct access to edit the user control's
children controls. For example, when you select your
InfoRectangle instance in Window1.xaml, you have no
direct ability to see inside your control and pick
out your InfoLabel's Content property or adjust your
rectangle's background color.
Because a user control can be considered a class,
you can access any of your user control's properties
using code itself. For example, to change the value
of your InfoRectangle user control's InfoLabel
label's content, you could just do the following:
InfoRectangle foo = new
InfoRectangle;
foo.InfoLabel.Content = "New Content!";
Of course, this isn't the best way to do this, for
the clean separation between visual properties and
code is one of the advantages of WPF. You will learn
the better dependency property approach for
accomplishing the same thing in the following pages.
There seems to exist a barrier that
prevents you from accessing those properties that
you could easily access when editing the user
control itself. Of course, because we want each
instance of our user control to have different text
and background colors, we cannot edit
InfoRectangle.xaml directly. Like you saw described
in the first page, any modification you make to your
user control's XAML or code-behind file
automatically gets applied to all instances of the
user control that exist in your project.
Fortunately, this is something that the WPF
designers thought about, and a formal (very formal)
mechanism exists for registering any properties you
are interested in exposing to a parent that will be
hosting your user control. Those properties are
known as Dependency Properties, and you'll be
introduced to them in greater detail shortly.
One thing we want to do is make our InfoLabel
editable by a parent such as
Window1.xaml. In Blend, open or navigate to
our InfoRectangle.xaml file. The text that is
currently displayed is located in our InfoLabel's
Content property:
[ your label's Content property is what determines
what gets displayed ]
Remember that piece of
information, for it will come in handy real soon.
What we need to do now (unfortunately?) is write
some code. Click on the Project tab, right click on
your UserControlSample C# solution, and from the
menu that appears, select Edit in Visual Studio:
[ we will need to edit our project in Visual Studio
(or C# Express) ]
After a few moments,
Visual Studio will launch. Once Visual Studio has
launched, find the Solution Explorer on the
top-right corner of your screen. This view is very
similar to the Project view you see in Blend.
From the Solution
Explorer, expand the InfoRectangle.xaml node to
display the InfoRectangle.xaml.cs file:
[ your Solution Explorer displays all of the files
currently used by your project ]
Double click on the
InfoRectangle.xaml.cs file to open it in Visual
Studio. Currently, this file doesn't really have
much content. Let's change that. What we
are going to do is create a dependency property that allows you to easily
change our user control's text. Don't worry
if you are not sure what dependency properties are or
what the following snippets of code mean. I will
cover that in greater detail in the next page.
Add the following
lines of code below your InfoRectangle constructor:
- public
string
InfoText
- {
- get
- {
- return
(string)
GetValue(InfoTextProperty);
- }
- set
- {
- SetValue(InfoTextProperty,
value);
- }
- }
-
- public
static
readonly
DependencyProperty
InfoTextProperty
=
-
DependencyProperty.Register(
-
"InfoText",
-
typeof(string),
-
typeof(InfoRectangle),
-
new
FrameworkPropertyMetadata(
new
PropertyChangedCallback(ChangeText)));
-
- private
static
void
ChangeText(DependencyObject
source,
DependencyPropertyChangedEventArgs
e)
- {
- (source
as
InfoRectangle).UpdateText(e.NewValue.ToString());
- }
-
- private
void
UpdateText(string
NewText)
- {
- InfoLabel.Content
=
NewText;
- }
Once you have copied
and pasted the above code, press F6 to make sure you
are not receiving any build errors. On the
next page, let's take a look at what happens in
Blend, and more importantly, let's backtrack and
revisit in detail the code you copied and pasted.
Onwards to the
next page!
|