Showing posts with label continue. Show all posts
Showing posts with label continue. Show all posts

Wednesday, February 4, 2026

Dates, Times, and Drop-Down Lists (10 of 18) Building Apps with XAML and .NET MAUI

today we're going to continue building
out the UI of our app and we're going to
look at dates and times and drop-down
[Music]
lists hi welcome to visual studio
toolbox I'm your host Robert Green and
I'm your presenter Paul sheriff and we
are continuing on in our 18p part series
on building apps with zaml and Maui and
as you may have noticed lesie is not
with us she's unable to make the second
half of the recordings so it will just
be me and Paul but since Paul's the
guest we promise it'll be just as
exciting so previously uh we looked at
switches and radio buttons and today
we're going to continue building out the
UI of our app and we're going to look at
dates and times and drop-down lists
that's right very cool stuff should be
pretty fun so so what we'll do is we'll
switch over to the screen here and we're
on our user information screen we're
going to keep adding to this screen here
I'm going to add one more additional row
and then we're going to go down here to
the bottom like we've been doing we're
just going to insert some areas here so
I'm going to
change these two rows here so we're
going scoo those down and then we're
going to add another
label and we're going to add what's
called a date picker so the date picker
as you kind of expect is one that looks
like just a regular calendar that will
pop up on the screen now this is on
windows so if you you know bring this up
on your Android or your iPhone it's
probably going to look a little
different right it might have those
little things just scroll through to
figure out date and then the uh you know
the day the date and then the year so it
might look a little bit different
depending on the operating system that
you're running on yeah because we kind
of didn't we didn't talk about the
architecture of how all this works but
basically you
write s just as you write HTML and it is
nothing more than the instructions on
the renderer some rendering engine on
how to draw a page zaml is essentially
the same thing and when you build the
application um behind the scenes Visual
Studio is building a native Windows app
a native Android app a native iOS or Mac
OS app so you're going to get the native
control so there will be differences you
just write the ex once and then
sometimes you got to wait and see what
it looks like on the actual platforms
and then you may have to adjust as
needed right so basically they're just
taking that zaml translating it to
whatever the real code is that will
actually run on iOS or Android or
whatever yeah y so all right but this is
kind of nice you know we have a little
uh date picker here so you can choose a
date and then you know of course it
updates the screen and then in a little
bit here we're going to talk about Act
doing The Binding back to a an
object all right so there's a date
picker let's now go up and add yet
another row so all I'm doing is just
changing those row that row definitions
attribute and I'm just adding on an
additional row and most of them are
going to be Auto all right if you have a
list which we'll talk about later in
this uh series we'll probably start
using the asteris to say take up the
most room for that particular list but
for now we're just going to stick with
the
auto so by adding another one that means
down here I'm going to be able to insert
right after the birth date here A Time
picker and then of course I'm going to
increase these rows here by one and now
this actually does look very similar to
what you might see on iOS or
Android this little time guy here right
so you can choose from the different
columns here you can move up up and down
and you can choose AM and PM and you can
just choose whatever time that you want
you click on the little uh check mark
there and that says accept it otherwise
if you'd made changes and everything you
canel it it just stays where it
was all right so time picker we have
date picker and then I'm sure a lot of
you have been doing development for
quite a while and so we always have some
sort of drop- down list where we want
the user to be able to choose
values so we going to give them a list
of values and they're going to choose
one so again I'm going to go back up
here go to
auto and once again we're just going to
increase everything down
here we change this one to 11 this one
to
12 like I said I really hope in the next
version they're going to give us a
little more help on that
so all right so what I'm doing in this
one is I'm adding label as you can see
here on lines 103 and
104 and then I'm using the flex layout
again so I wanted to be aity to have an
entry area and then a picker right so
now the Picker you'll notice that I'm
getting these squigglies here and the
reason why is when you add a picker and
it's got this hardcoded array you must
stop and restart in order for that to
take so if that ever happens to you
you're going to if you see those little
squigglies you just got to restart so
that squiggly is just a hot reload thing
it's nothing wrong with your code you
got it got it yeah so if you're you're
dynamically adding things you're getting
squiggles and you know that that code is
correct it probably just means you got
to do a you know the hot reload isn't
gonna be able to reload that guy so
you're gonna have to restart and then a
few episodes ago you would talked about
the difference between just writing the
straight zaml and using the property
windows so is this a perfect example of
when instead of doing picker. item
Source xarray type equal and then
wrapping all the values in strings that
you could do that more easily with the
properties
window you know I haven't tried that one
that's a really good question let's
actually go here let's bring up the
properties's window I always just write
the actually I never write hardcoded
stuff like
this um I mean but if you doing a
prototype or something you might want do
something like this right so what you're
asking really is could you come in here
and actually go into the items and add
something so I'm I'm sure you can uh
let's see if we do an ad here no see it
doesn't work on the items okay
interesting might on the item Source
let's see okay so let's see
here well I've not seen any direct way
to do it here it's just giv me an object
and the object itself isn't really going
to work for us because we need this for
okay yeah good good question though and
that that would be normally something
that I think you could do um I typically
used it like in WPF when I was building
uh menu items and things like that I
found it pretty helpful um but tell you
the truth I don't really use it a
lot pretty much stick in the zaml which
is I think what you do too sure but
that's how we grew up uh doing that's
right did we ever grow up Robert come on
no that's what we have SP our career is
doing let's put there we go that's
that's a better good
point all right so let's go back here
and so what I wanted was I wanted this
ability to have an entry screen entry
area here and so I can type in a phone
number for
instance and then I wanted to drop down
so the user could choose hey what kind
of you know phone number is this right
so is it mobile is it home is it other
and you see those values here now being
represented here in this picker or drop
down
list right yeah so and the reason I use
a flex layout is I didn't want to use I
didn't want to have to have the grid
three columns I think I mentioned this
before I find it better if you stick
with just two columns for entry screens
if you have more than you know two
things that you need go to this Flex
layout because then if if for some
reason it needs to you know wrap and I
don't think I actually put the wrap in
here on this one so we do Wrap like
so okay and then let's see direction
would be
row and that way it could push this
underneath I think that's another one of
those I got to restart but you get the
idea okay okay so anytime you have more
than one thing in that second column use
the flex layout and that's going to give
you the most flexibility and so so
basically if you narrow the
screen then instead of being off the
screen and not visible that picker would
just flip down below that phone number
okay just like these check boxes did up
here if you remember those were also
wrapped within the flex layout you can
see here yeah so I think the wrap and
the direction I think that has to be a
restart on that or could even just be a
hot reload uh I think it's a a restart
type of
situation so you just want to you know
make sure you're always putting that in
if if that's something that you need I
personally like I said never go beyond
two so I I do use this Flex layout quite
a bit
so all right let's try this out this
should actually give us what we're
looking for here oops there we go let
see mobile
one that oh oh you know what it can only
go so far see look at this it's on the
same here okay so which means that it's
determining that the minimum width is
you're fine basically because that I
mean there's no way a phone's going to
be less than about like that okay right
so so in this particular case it didn't
need it which is great but you could see
let's say if we added a little bit more
room to this right I did a minimum
request here you know if I if I move
this out a little bit maybe it will
cause it to
wrap and for some reason boy it's just
not wanting to is
it so well I I you know I think it's
just one of those things where it's
termining that hey you know what we're
fine but y we'd again have to check with
that and well main thing you try it on
your Android or your iOS and make sure
right cool all right great so there we
go date Pickers time Pickers and those
uh uh drop- down lists which is just
simply called a
picker excellent and then of course
there they come with all kinds of
properties so you can set default values
and you can that's correct absolutely so
you can see on the time I did re I did
set the default time here to 6: am y you
know you can do the same thing on the
date picker you can set the date
property and then maximum date minimum
date Etc oh yeah so if you're doing a
some type of thing where you can only
enter a date that's a week from today
you can set the minimum date to today
plus s Etc you got it and again let's
say you wanted to do something a little
more than Dynamic you don't want a
hardcoded datee in here or hardcoded
minimum and maximum date right that's
one of those times when you would name
this control yep you know the date or
whatever yes yeah because then in the
back you know in your code behind you
can actually use C to say the date. DAT
equals date time. now for instance right
you know and minimum date could be you
know today's date and maximum date could
be plus you know 30 days or something
sure so cool yeah so anytime that you
need to find yourself going to write
some code to dynamically set things like
maybe you want the time you don't want
to default it to 6: am you want it to
whatever the time is right now or the
nearest hour to that right again give it
a name and then in the code behind which
we're going to talk about little bit
more code behind here coming up that's
where you would then be able to set
those particular
values excellent y all right so what's
in our next episode so coming up next
we're gonna actually start talking about
data binding which will be great um
we're gonna kind of got a couple of uh
versions of data binding we're gonna
look at the first one is actually going
to be just kind of binding controls to
controls so like on the screen you want
this control to affect how this control
works we'll talk about that and then
we're going to talk about creating C
objects and binding those
to our UI cool can't wait all right all
right so thanks for watching and we will
see you next time on Visual Studio
[Music]
toolbox

Debugging Tips and Tricks Part 2

>> On today's Toolbox,
we're going to continue
fixing the app we started
working on last week,
and Leslie will show us additional
tips and tricks for debugging.
Hi, welcome to Visual Studio Toolbox.
I'm your host Robert Greene,
and joining me today for part two of
our debugger tips and tricks
is Leslie Richardson.
>> Hey there.
>> Hi, Leslie.
>> Hi.
>> Welcome back.
>> Thank you.
>> You haven't changed a bit since
we recorded the last episode.
>> I know. It was almost like it
like happened five minutes ago.
>> Almost.
>> Yeah.
>> So refresh our memories,
what did we see in part one.
>> Yeah. So in part one, we talked
about a lot of different things,
from Run To Click, set
to .NET statement,
Text Visualizers, DebuggerDisplay
which is my personal favorite,
and of course,
conditional breakpoints,
tracepoints and the list goes on.
>> Cool. So what are
we going to see today?
>> So today we're going to see
a lot of different things,
including some of
the new 2019 features like
Search for the Watch window,
manage data breakpoints.
>> Okay.
>> Then other little things peppered
throughout in the Watch window
such as return value,
keywords, and format specifiers.
>> All right. Cool.
>> It goes on.
>> All right. We're
using the same app.
>> Yeah.
>> Which in spite of
the fact that we've
spent all last week fixing it,
still isn't 100 percent correct.
>> Yeah. Still many, many problems.
>> We like to mimic
the real-world in this show.
>> Fair enough. Yeah. So again,
as a refresher, this is
the same app as in part one,
but it's an app that
will randomly give me
a list of books that I can choose
to read and add to my shelf,
or I can choose not to read it and
it won't be added to my shelf.
So there's several more bugs
that we didn't
fix last week or throughout
the week either,
so they're still here.
So let's investigate those.
So I'm going to add a book,
in this case, this book called
Middlemarch to my shelf.
When I click on it, one of
the problems I have been
experiencing revolves
around this String
here that says that I've
read the book one time.
>> Already. Wow.
>> Yeah, already. I know. I
haven't even heard of the book.
>> That leads you to where to
get to your 100 books done.
If you just click it, it
will mark it as read.
>> Yes. There I already read it.
>> Then I'm going to predict
that that date is an issue.
>> Yeah. That date is also an issue.
>> Looking ahead.
>> Lots of problem is going on here.
>> Okay.
>> Yeah. So what's supposed to happen
is when I select 'I
finished this book',
this value should increment by one.
It's already saying I read one time,
which is ominous in and of itself.
>> Okay.
>> So if I say that I
finished this book,
it should jump from one to two,
but if I do it in this case,
it's jumped from one to four.
So either I subconsciously
read this book three more
times in the last three seconds,
or there's something going on
in Visual Studio and my code.
>> Then the date changes.
>> Yeah. All right.
So let's see if we can
fix that problem of
reading it three additional
times out of nowhere.
>> Okay.
>> So I'm going to
set a breakpoint at
the start of my index function here,
and that will hit when I
go back to my shelf page.
From there, I want to hone in on
that specific book which
was called Middlemarch.
I can't even remember the title
and I read it three times.
So from there, instead
of simply expanding until
I find what I want,
I can use the brand new
search tool available and
the Autos, Locals, and Watch windows
for our Visual Studio 2019.
>> Oh, yes.
>> So from here,
I'm going to do Middlemarch,
I think I can just say middle.
As you can see, I'm directly
taken to where I need to go.
>> That's so cool. Again,
that is new in 2019.
>> Yeah. It is brand new.
>> Now, I remember correctly
you wrote a blog post on that.
>> I did. I recently wrote
a blog post on that,
where you can go to
aka.mswatchwindowsearch,
and then check it out.
>> Cool.
>> For more detailed info.
So from there, I have that.
You'll also notice that
as I start typing,
it will automatically
start highlighting for me.
So in the case you don't want
to execute the full search,
you can just type away and
if it's visible on screen,
it will start highlighting
and you can find things
that way as well.
Especially, this is
really nice if you have
a bunch of items in
the Watch window at a time,
which can save you
the trouble of having it all.
>> Does that do both the
name and the value?
>> Yeah. So you can search for name,
value or type if you wanted to.
>> Okay.
>> So if you just wanted
to see all the types,
I can search a reading list and
as you can see I'll start going.
>> Okay. Cool.
>> All right. So from
there I have Middlemarch,
and I'm specifically interested
in a property that this book has
called timesRead and
this is the property
that's supposed to increment
every time I finish it.
So I'm going to go into timesRead,
and this time I get
a notification telling me
that it couldn't be found,
but luckily, it's giving
me the suggestion to
bump up my search depth
to a larger number.
So I'm going change the search
depth here to three,
so that I can search more thoroughly.
>> Does it default to two.
>> For me I set my default to two,
but normally when you first download
Visual Studio for the first time,
it's set to three.
>> Where do you change
that, is that an option?
>> Yes.
>> Or just remember
the last thing you set.
>> Yeah, it will remember.
>> Okay. Got it.
>> So if you set your search depth to
10 and then you exit out of
the session if it's reading one,
it will remember that you were at 10.
>> Okay.
>> Yeah. I'm going to
bump mine up to three,
and then I'm taken to
that particular property,
again saving some time of having
to remember where that property is.
Now, the case that I'm
trying to deal with is,
why is this timesRead property
changing without my knowledge?
Normally, this is when I might
have to play some trial and
error and try to narrow down
where it could possibly
be coming from,
but I ultimately don't know
where that location could be.
So I can use something
called a data breakpoint,
which has existed in C++ for awhile,
but is brand new to manage
code users in .NET Core 3.0 in 2019.
So this is a breakpoint
that will allow me to halt
my code when a specific
object's property changes,
even if it goes out of scope.
So I'm going to use that in
order to track down the problem.
So I can right-click on
that property and then select
"Break One Value Changes".
I know that the data
breakpoint has been
created because I have
the standard breakpoint icon there.
>> Nice.
>> Yeah. Of course I
can see it along with
the rest of the other
breakpoints that
I have in the breakpoints window.
Then if I scroll up a little bit
to the top of this item,
an object ID has been created,
and this is how Visual Studio
will be able to keep track
of that object if it ever goes out
of scope while my program is running.
So from there, I'm
going to hit "Continue"
and perform the same action again,
and hopefully I get
some quick fast useful information.
Yeah. So this time I
get an a notification
telling me that my data
breakpoint has been hit,
with an added bonus
of telling me what
the previous value of
that particular property was,
and now what the new
current value is.
It'll also redirect me to
the exact location where
that change came from.
So in this case, obviously it's
coming from the property setter,
which makes sense, but ideally,
I'd like to know what called it.
So I can go into the call stack
and then just double-click here,
and then I'll be taken to
where that setter was called.
In this case, it's happening in
my get shelved book function,
which I don't need because I already
set the timesRead property
to be committed elsewhere.
>> Yeah. So you retrieve the list.
So the fact that you got the book
off the shelf is being
equated to reading it.
>> Yeah. Apparently.
>> Yeah. Okay.
>> That's what I did in
high school from time to time
if I didn't like the book,
like time to go to spark notes,
but I'll buy the book anyway,
just so it looks legit.
>> So there's
another blog post that you
wrote on this as well,
Managed data breakpoints.
>> There is, yeah. Yeah.
Definitely go check
it out at
aka.msmanageddatabreakpoints.
>> Managed data breakpoint.
>> Yeah.
>> All right.
>> Kind of a mouthful but.
>> We'll have these
in the show notes.
>> Yeah. Looks all good.
>> All right. Cool.
>> Great. So now that
I found the issue,
I'm going to comment out this line.
>> That is really
helpful because you're
now being notified when it changed,
and then go finding out why,
and then you get to decide whether
that's valid or not. Very cool.
>> Absolutely. So it can be great
in several different scenarios.
>> That can save a ton of time.
>> Right. Yeah. You
don't want to play
trial and error all time nonstop.
So this is currently a
Dynacore 3.0 exclusive
feature at the moment though.
>> All right. Okay.
>> So yeah.
You're going to need to get
3.0 and play around with that
if you want to check these
out in a managed code land.
>> Is it scheduled to make it
into framework or is that TBD?
>> TBD.
>> Okay.
>> We've gotten a lot
of feedback about that,
so it has not been forgotten.
We are acknowledging that
and go in from there.
>> Okay.
>> Cool. So going back and
performing that same action.
In this case, I'm going to read
some other book I've never
heard of called Mrs Dalloway,
but this time correctly it
tells me I haven't read it yet.
>> Okay.
>> So that's a good sign.
If I say I finished
the book and go back to it,
it's increased from zero to one.
So yeah, those are
data breakpoints and searching.
So data breakpoints again are
extremely useful for many scenarios.
In that case, I just wanted to
hone in on a specific object.
So it's great for that, especially
in contrast to if
you were to just set
a breakpoint on that property setter
where multiple objects
could be accessing that,
and maybe you don't want that.
>> Yeah.
>> It's also good if you have
a global variable
that's being accessed
across multiple files and things and
you don't know where
it's being modified,
and you can use that for this.
>> Yeah.
>> Or maybe you just inherited one of
your teammate's pieces of code
and you're unfamiliar with it,
but there's something
going on in it that's
causing a property to change
without your knowledge.
So then you can use
a data breakpoint to hunt it
down instead of having to play,
"Well, maybe it's in this area.
I don't know what
this piece of code does."
>> Yeah.
>> Let's try it.
>> Cool.
>> This type of deal. All right.
So from there, there's one last bug
that I want to deal with.
It's not so much of a bug, so much as
an added addition on my part.
But the line right
below read one times,
it tells me when I last
completed the book,
but I have a tendency to
read multiple books at once,
and can finished several books
in one day as a result,
so I'd like to know also
the exact time that I
finished it as well.
>> Oh, okay.
>> So that's currently not there.
So I want to go into Visual Studio
and see where I can add that.
So I'm going to set a breakpoint
at this line here that
returns that related String
about when I finished the book,
and refresh the page.
Just looking at it at first glance,
there's a lot going on on this line,
I have a nested function call
happening within a parameter
of an outer function call,
and then there's a property value
being fed, it's a lot.
So I want to break down
this line of code and
see what pieces of the String
are coming from where,
just so I have a better
understanding of what's happening.
So the first thing
I want to look into
is the Person.ToString function.
But as it stands now,
if I were to try to use depth into
or step-over or any of those,
there's not really a way to get into
that nested function from there.
>> All right.
>> So I can use step into
specific in order to
choose which of these function calls
I want to go to first.
>> Is that new in 2019?
>> No. This has been around.
Yeah. This is an old one.
>> Yeah. So it's been
around for awhile.
So I can right-click this line,
and I can go to step into specific,
and I'll get a dropdown with all
the different places I can go to.
>> Yeah. We need to add
a feature to Visual Studio where
when you hover over something,
it will tell you when
it first appeared.
>> That would be amazing, if
there is an extension for that.
>> Yeah.
>> It's like, Visual
Studio history extension.
>> Exactly. Yeah. Just for fun.
>> Yeah. So you can pull
your hair out wonder,
''How did I not know
about that seriously?''
>> You can load it over your friends.
>> Oh, man. Yeah. So from there,
I can select person.ToString and
just as if I were to use
the regular step into,
it'll take me into that function.
Yes, so super great.
So this one is pretty
straightforward.
It's just returning the
value of the parameter
that I gave it in which case
it was just my name.
So I'm going to step through
it and then step out.
Then I'm back to this line again.
So from there, now I want to look
into the FinishedToString
method here.
So again, using Step Into Specific,
I'm going to select that one.
Here, I'll be taken to
the FinishedToString method.
I have even more stuff going on here.
I have some string
concatenation going on.
So first, I just like to see what
is the exact return value
with this method?
But normally, in order to do that
because it's not currently set to a
variable at first, I
would think, Oh, great.
Now, I got to stop
debugging and set it to
an arbitrary variable and then
look in the Watch window or something
what that variable could be.
But another way that you can look at
this return value without
having to stop debugging and
do all that is to step to
the end of that function.
You'll notice that in the Locals
as well as the Autos window,
there is a line that has
the return key Word on it,
and that will tell you exactly
what's being returned
by that function.
So that happens by default.
So you don't have to do any other
additional leg work in order to
see the results of something that's
not set to a particular variable.
Another way that you can do this
is also in the Watch window.
So I'm going to add dollar sign
and then ReturnValue,
and then I get that same result.
>> Okay, cool.
>> So the added bonus
about being able
to do that in
the Watch window is that,
I can also add
format specifiers to it,
which are things that allow me to
temporarily view the contents
of the Watch window
in a different light.
So if I wanted to remove the quotes
around the string for instance,
because they're
redundant at this point,
I can add a comma to the item
I have here and I'll get
this dropdown which is new to 2019,
with a list of different
format specifiers I can use.
So instead of having to
memorize the giant table
that you'd have to look up online,
it'll give me some options
right off the bat.
So I'm going to select nq,
which stands for
string with no quotes.
Hit "Enter" in that
will enable it to pass.
>> That's just in the Watch window,
you're not actually
touching the running code.
>> Correct.
>> Okay.
>> I'm not filling with
the code itself at all.
Yeah. So great.
From there, I now want to step
into yet another function,
I have this finished
book string here.
But again, I am
now under scope because I've
reached the end of the function,
so I need to get back to it.
I'm going to use that to
next statement again.
There's several ways you can
use that to next statement.
I can actually drag the execution
arrow up if I wanted to,
instead of holding down the control
key, like I did previously.
So from there once more,
we're going to use
Step Into Specific,
and I'm going to select
FinishedBookString.
Here, I'm being taken to
yet another function with
more string concatenation going on.
So let's say, I wanted to
break down this line of code.
So I can use ReturnValue again.
Again, I'm going to step to
the end of the function.
This time, I have
the final result here, of course.
But if I wanted to break
it down even further,
then I can do that as well
by adding ReturnValue,
I can do ReturnValue1.
Now, give me the result
of this.Title.
If I wanted to get this last
read date thing over here,
then I can also do ReturnValue3,
and that will give me
the value of these two.
>> It's interesting.
>> This also goes for
if you're looking
in the Locals and Autos windows,
it will surely do things like this.
>> So why do that rather than just
if hovered over this .Title,
it shows you that information.
All right. If you hovered
over ToShortDateString,
it shows you that.
>> Yep.
>> You can also add those
to the Watch window.
So when would you list
the value of being able
to specify ReturnValue1,
ReturnValue3?
>> It's just another variation to be
able to look at what's being
returned on top of that,
you're doing it in the Watch window.
You can mess around with
the format specifiers and stuff,
and just keep everything
grouped together.
I like to say organize though.
I'd prefer to just have
all the ReturnValue group together.
>> Okay.
>> So all right.
From there, I have found where I can
add my time-related scenario
because I have
this ToShortDateString function
here that I don't need
in order to show
the full time and the date.
>> Right.
>> From there, I'm going to
continue running my code.
>> That is known as
edit and continue.
>> That it's edit and continue that.
Yeah, that's a magic that
sometimes it works,
sometimes it doesn't.
>> Yeah.
>> This is a scenario where it
should work because if
I refresh the speed.
>> I remember when
that was introduced.
>> Okay.
>> That's amazing.
>> When was it introduced?
Because I think that was interesting.
>> But they told you
then I meet to date
and I had to admit it a while ago.
>> Yep. So we are making-
>> I'm old enough to
remember when that
was introduced the first time.
>> Awesome, yep.
So isn't empty tool when it works,
we are making improvements
on it as we speak however.
>> Cool.
>> So yeah. From there,
I just refreshed the page,
and as you can see,
I now have the time.
That was ReturnValue,
Step Into Specific,
Format Specifiers,
and then Set To Next Statement
made a reprise as well.
>> Cool. So now the app is perfect.
>> Yeah. Now it's absolutely
perfect. There is
nothing wrong with it.
I'm never going to have
any trouble with it ever again.
>> Cool. So over the course
of these two parts,
we've obviously seen some things
that we knew were in
there, learned a lot.
I saw a number of things I
didn't know were in there,
including some things that
have been in there for awhile.
So this has been
great. Thanks so much.
>> Awesome. Thanks for
having me yet again.
>> Hope you guys enjoyed that.
We will see you next time
on Visual Studio Toolbox.