mirror of
https://github.com/Stone-Red-Code/docs-desktop.git
synced 2026-09-04 09:06:04 +02:00
merge main branch
This commit is contained in:
@@ -644,6 +644,14 @@
|
||||
{
|
||||
"source_path": "dotnet-desktop-guide/framework/wpf/events/marking-routed-events-as-handled-and-class-handling.md",
|
||||
"redirect_url": "/dotnet/desktop/wpf/advanced/marking-routed-events-as-handled-and-class-handling?view=netframeworkdesktop-4.8"
|
||||
},
|
||||
{
|
||||
"source_path": "dotnet-desktop-guide/net/wpf/advanced/object-lifetime-events.md",
|
||||
"redirect_url": "/dotnet/desktop/wpf/events/object-lifetime-events?view=netdesktop-6.0"
|
||||
},
|
||||
{
|
||||
"source_path": "dotnet-desktop-guide/framework/wpf/events/object-lifetime-events.md",
|
||||
"redirect_url": "/dotnet/desktop/wpf/advanced/object-lifetime-events?view=netframeworkdesktop-4.8"
|
||||
}
|
||||
]
|
||||
}
|
||||
|
||||
@@ -0,0 +1,111 @@
|
||||
---
|
||||
title: "Object lifetime events"
|
||||
description: Learn about the object lifetime events for framework-level elements in Windows Presentation Foundation (WPF).
|
||||
ms.date: "03/31/2022"
|
||||
dev_langs:
|
||||
- "csharp"
|
||||
- "vb"
|
||||
helpviewer_keywords:
|
||||
- "events [WPF], ContentRendered"
|
||||
- "events [WPF], Deactivated"
|
||||
- "events [WPF], Unloaded"
|
||||
- "Activated events [WPF]"
|
||||
- "events [WPF], Loaded"
|
||||
- "Application objects [WPF], lifetime events"
|
||||
- "events [WPF], Activated"
|
||||
- "ContentRendered events [WPF]"
|
||||
- "Deactivated events [WPF]"
|
||||
- "events [WPF], Initialized"
|
||||
- "events [WPF], Closing"
|
||||
- "Unloaded events [WPF]"
|
||||
- "exit events [WPF]"
|
||||
- "objects' lifetime events [WPF]"
|
||||
- "Loaded events [WPF]"
|
||||
- "Closing events [WPF]"
|
||||
- "events [WPF], Closed"
|
||||
- "Initialized events [WPF]"
|
||||
- "Closed events [WPF]"
|
||||
- "startup events [WPF]"
|
||||
- "lifetime events of objects [WPF]"
|
||||
---
|
||||
<!-- The acrolinx score was 96 on 03/31/2022-->
|
||||
|
||||
# Object lifetime events (WPF .NET)
|
||||
|
||||
During their lifetime, all objects in Microsoft .NET managed code go through _creation_, _use_, and _destruction_ stages. Windows Presentation Foundation (WPF) provides notification of these stages, as they occur on an object, by raising lifetime events. For WPF framework-level elements (visual objects), WPF implements the <xref:System.Windows.FrameworkElement.Initialized>, <xref:System.Windows.FrameworkElement.Loaded>, and <xref:System.Windows.FrameworkElement.Unloaded> lifetime events. Developers can use these lifetime events as hooks for code-behind operations that involve elements. This article describes the lifetime events for visual objects, and then introduces other lifetime events that specifically apply to window elements, navigation hosts, or application objects.
|
||||
|
||||
[!INCLUDE [desktop guide under construction](../../includes/desktop-guide-preview-note.md)]
|
||||
|
||||
## Prerequisites
|
||||
|
||||
This article assumes a basic knowledge of how WPF element layout can be conceptualized as a tree, and that you've read [Routed events overview](/dotnet/desktop/wpf/advanced/routed-events-overview?view=netframeworkdesktop-4.8&preserve-view=true). To follow the examples in this article, it helps if you're familiar with Extensible Application Markup Language (XAML) and know how to write WPF applications.
|
||||
|
||||
## Lifetime events for visual objects
|
||||
|
||||
WPF framework-level elements derive from <xref:System.Windows.FrameworkElement> or <xref:System.Windows.FrameworkContentElement>. The <xref:System.Windows.FrameworkElement.Initialized>, <xref:System.Windows.FrameworkElement.Loaded>, and <xref:System.Windows.FrameworkElement.Unloaded> lifetime events are common to all WPF framework-level elements. The following example shows an element tree that's primarily implemented in XAML. The XAML defines a parent <xref:System.Windows.Controls.Canvas> element that contains nested elements, which each use XAML attribute syntax to attach `Initialized`, `Loaded`, and `Unloaded` lifetime event handlers.
|
||||
|
||||
:::code language="xaml" source="./snippets/object-lifetime-events/csharp/MainWindow.xaml" id="LifetimeEventsXaml":::
|
||||
|
||||
One of the XAML elements is a custom control, which derives from a base class that assigns lifetime event handlers in code-behind.
|
||||
|
||||
:::code language="csharp" source="./snippets/object-lifetime-events/csharp/MainWindow.xaml.cs" id="LifetimeEventsCodeBehind":::
|
||||
:::code language="vb" source="./snippets/object-lifetime-events/vb/MainWindow.xaml.vb" id="LifetimeEventsCodeBehind":::
|
||||
|
||||
The program output shows the order of invocation of `Initialized`, `Loaded`, and `Unloaded` lifetime events on each tree object. Those events are described in the following sections, in the order that they're raised on each tree object.
|
||||
|
||||
### Initialized lifetime event
|
||||
|
||||
The WPF event system raises the <xref:System.Windows.FrameworkElement.Initialized> event on an element:
|
||||
|
||||
- When the properties of the element are set.
|
||||
- Around the same time that the object is initialized through a call to its constructor.
|
||||
|
||||
Some element properties, such as <xref:System.Windows.Controls.Panel.Children%2A?displayProperty=nameWithType>, can contain child elements. Parent elements can't report initialization until their child elements are initialized. So, property values are set starting with the most deeply nested element(s) in an element tree, followed by successive parent elements up to the application root. Since the `Initialized` event occurs when an element's properties are set, that event is first invoked on the most deeply nested element(s) as defined in markup, followed by successive parent elements up to the application root. When objects are dynamically created in code-behind, their initialization may be out of sequence.
|
||||
|
||||
The WPF event system doesn't wait for all elements in an element tree to be initialized before raising the `Initialized` event on an element. So, when you write an `Initialized` event handler for any element, keep in mind that surrounding elements in the logical or visual tree, particularly parent elements, may not have been created. Or, their member variables and data bindings might be uninitialized.
|
||||
|
||||
> [!NOTE]
|
||||
> When the `Initialized` event is raised on an element, the element's expression usages, such as dynamic resources or binding, will be unevaluated.
|
||||
|
||||
### Loaded lifetime event
|
||||
|
||||
The WPF event system raises the <xref:System.Windows.FrameworkElement.Loaded> event on an element:
|
||||
|
||||
- When the logical tree that contains the element is complete and connected to a presentation source. The presentation source provides the window handle (HWND) and rendering surface.
|
||||
- When data binding to local sources, such as other properties or directly defined data sources, is complete.
|
||||
- After the layout system has calculated all necessary values for rendering.
|
||||
- Before final rendering.
|
||||
|
||||
The `Loaded` event isn't raised on any element in an element tree until _all_ elements within the [logical tree](/dotnet/desktop/wpf/advanced/trees-in-wpf#the-purpose-of-the-logical-tree) are loaded. The WPF event system first raises the `Loaded` event on the root element of an element tree, then on each successive child element down to the most deeply nested element(s). Although this event might resemble a [tunneling](<xref:System.Windows.RoutingStrategy.Tunnel>) routed event, the `Loaded` event doesn't carry event data from one element to another, so marking the event as handled has no effect.
|
||||
|
||||
> [!NOTE]
|
||||
> The WPF event system can't guarantee that asynchronous data bindings have completed before the `Loaded` event. Asynchronous data bindings bind to external or dynamic sources.
|
||||
|
||||
### Unloaded lifetime event
|
||||
|
||||
The WPF event system raises the <xref:System.Windows.FrameworkElement.Unloaded> event on an element:
|
||||
|
||||
- On removal of its presentation source, or
|
||||
- On removal of its visual parent.
|
||||
|
||||
The WPF event system first raises the `Unloaded` event on the root element of an element tree, then on each successive child element down to the most deeply nested element(s). Although this event might resemble a [tunneling](<xref:System.Windows.RoutingStrategy.Tunnel>) routed event, the `Unloaded` event doesn't propagate event data from element to element, so marking the event as handled has no effect.
|
||||
|
||||
When the `Unloaded` event is raised on an element, it's [parent](<xref:System.Windows.FrameworkElement.Parent%2A>) element or any element higher in the logical or visual tree may have already been _unset_. Unset means that an element's data bindings, resource references, and styles are no longer set to their normal or last known run-time value.
|
||||
|
||||
## Other lifetime events
|
||||
|
||||
From the lifetime events perspective, there are four main types of WPF objects: elements in general, window elements, navigation hosts, and application objects. The <xref:System.Windows.FrameworkElement.Initialized>, <xref:System.Windows.FrameworkElement.Loaded>, and <xref:System.Windows.FrameworkElement.Unloaded> lifetime events apply to all framework-level elements. Other lifetime events specifically apply to window elements, navigation hosts, or application objects. For information about those other lifetime events, see:
|
||||
|
||||
- [Application management overview](/dotnet/desktop/wpf/app-development/application-management-overview?view=netframeworkdesktop-4.8&preserve-view=true) for <xref:System.Windows.Application> objects.
|
||||
- [Overview of WPF windows](/dotnet/desktop/wpf/app-development/wpf-windows-overview) for <xref:System.Windows.Window> elements.
|
||||
- [Navigation overview](/dotnet/desktop/wpf/app-development/navigation-overview?view=netframeworkdesktop-4.8&preserve-view=true) for <xref:System.Windows.Controls.Page>, <xref:System.Windows.Navigation.NavigationWindow>, and <xref:System.Windows.Controls.Frame> elements.
|
||||
|
||||
## See also
|
||||
|
||||
- <xref:System.Windows.FrameworkElement.Initialized>
|
||||
- <xref:System.Windows.FrameworkElement.Loaded>
|
||||
- <xref:System.Windows.FrameworkElement.Unloaded>
|
||||
- [Handle a Loaded Event](/dotnet/desktop/wpf/advanced/how-to-handle-a-loaded-event?view=netframeworkdesktop-4.8&preserve-view=true)
|
||||
- [The Loaded event and the Initialized event](/archive/blogs/mikehillberg/the-loaded-event-and-the-initialized-event)
|
||||
- [Trees in WPF](/dotnet/desktop/wpf/advanced/trees-in-wpf)
|
||||
- [Routed events overview](/dotnet/desktop/wpf/advanced/routed-events-overview?view=netframeworkdesktop-4.8&preserve-view=true)
|
||||
@@ -0,0 +1,9 @@
|
||||
<Application x:Class="CodeSampleCsharp.App"
|
||||
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
|
||||
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
|
||||
xmlns:local="clr-namespace:CodeSampleCsharp"
|
||||
StartupUri="MainWindow.xaml">
|
||||
<Application.Resources>
|
||||
|
||||
</Application.Resources>
|
||||
</Application>
|
||||
+11
@@ -0,0 +1,11 @@
|
||||
using System.Windows;
|
||||
|
||||
namespace CodeSampleCsharp
|
||||
{
|
||||
/// <summary>
|
||||
/// Interaction logic for App.xaml
|
||||
/// </summary>
|
||||
public partial class App : Application
|
||||
{
|
||||
}
|
||||
}
|
||||
+10
@@ -0,0 +1,10 @@
|
||||
using System.Windows;
|
||||
|
||||
[assembly: ThemeInfo(
|
||||
ResourceDictionaryLocation.None, //where theme specific resource dictionaries are located
|
||||
//(used if a resource is not found in the page,
|
||||
// or application resource dictionaries)
|
||||
ResourceDictionaryLocation.SourceAssembly //where the generic resource dictionary is located
|
||||
//(used if a resource is not found in the page,
|
||||
// app, or any theme specific resource dictionaries)
|
||||
)]
|
||||
+25
@@ -0,0 +1,25 @@
|
||||
<Project Sdk="Microsoft.NET.Sdk">
|
||||
|
||||
<PropertyGroup>
|
||||
<OutputType>WinExe</OutputType>
|
||||
<TargetFramework>net6.0-windows</TargetFramework>
|
||||
<UseWPF>true</UseWPF>
|
||||
<NeutralLanguage>en-us</NeutralLanguage>
|
||||
</PropertyGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<Compile Update="Properties\Resources.Designer.cs">
|
||||
<DesignTime>True</DesignTime>
|
||||
<AutoGen>True</AutoGen>
|
||||
<DependentUpon>Resources.resx</DependentUpon>
|
||||
</Compile>
|
||||
</ItemGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<EmbeddedResource Update="Properties\Resources.resx">
|
||||
<Generator>ResXFileCodeGenerator</Generator>
|
||||
<LastGenOutput>Resources.Designer.cs</LastGenOutput>
|
||||
</EmbeddedResource>
|
||||
</ItemGroup>
|
||||
|
||||
</Project>
|
||||
+19
@@ -0,0 +1,19 @@
|
||||
<Window x:Class="CodeSampleCsharp.MainWindow"
|
||||
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
|
||||
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
|
||||
xmlns:custom="clr-namespace:CodeSampleCsharp"
|
||||
Title="Object lifetime events" Height="100" Width="300">
|
||||
|
||||
<!--<LifetimeEventsXaml>-->
|
||||
<Canvas x:Name="canvas">
|
||||
<StackPanel x:Name="outerStackPanel" Initialized="InitHandler" Loaded="LoadHandler" Unloaded="UnloadHandler">
|
||||
<custom:ComponentWrapper x:Name="componentWrapper" Initialized="InitHandler" Loaded="LoadHandler" Unloaded="UnloadHandler">
|
||||
<TextBox Name="textBox1" Initialized="InitHandler" Loaded="LoadHandler" Unloaded="UnloadHandler" />
|
||||
<TextBox Name="textBox2" Initialized="InitHandler" Loaded="LoadHandler" Unloaded="UnloadHandler" />
|
||||
</custom:ComponentWrapper>
|
||||
</StackPanel>
|
||||
<Button Content="Remove canvas child elements" Click="Button_Click"/>
|
||||
</Canvas>
|
||||
<!--</LifetimeEventsXaml>-->
|
||||
|
||||
</Window>
|
||||
+71
@@ -0,0 +1,71 @@
|
||||
using System.Diagnostics;
|
||||
using System.Windows;
|
||||
using System.Windows.Controls;
|
||||
|
||||
namespace CodeSampleCsharp
|
||||
{
|
||||
//<LifetimeEventsCodeBehind>
|
||||
public partial class MainWindow : Window
|
||||
{
|
||||
public MainWindow() => InitializeComponent();
|
||||
|
||||
// Handler for the Initialized lifetime event (attached in XAML).
|
||||
private void InitHandler(object sender, System.EventArgs e) =>
|
||||
Debug.WriteLine($"Initialized event on {((FrameworkElement)sender).Name}.");
|
||||
|
||||
// Handler for the Loaded lifetime event (attached in XAML).
|
||||
private void LoadHandler(object sender, RoutedEventArgs e) =>
|
||||
Debug.WriteLine($"Loaded event on {((FrameworkElement)sender).Name}.");
|
||||
|
||||
// Handler for the Unloaded lifetime event (attached in XAML).
|
||||
private void UnloadHandler(object sender, RoutedEventArgs e) =>
|
||||
Debug.WriteLine($"Unloaded event on {((FrameworkElement)sender).Name}.");
|
||||
|
||||
// Remove nested controls.
|
||||
private void Button_Click(object sender, RoutedEventArgs e) =>
|
||||
canvas.Children.Clear();
|
||||
}
|
||||
|
||||
// Custom control.
|
||||
public class ComponentWrapper : ComponentWrapperBase { }
|
||||
|
||||
// Custom base control.
|
||||
public class ComponentWrapperBase : StackPanel
|
||||
{
|
||||
public ComponentWrapperBase()
|
||||
{
|
||||
// Assign handler for the Initialized lifetime event (attached in code-behind).
|
||||
Initialized += (object sender, System.EventArgs e) =>
|
||||
Debug.WriteLine($"Initialized event on componentWrapperBase.");
|
||||
|
||||
// Assign handler for the Loaded lifetime event (attached in code-behind).
|
||||
Loaded += (object sender, RoutedEventArgs e) =>
|
||||
Debug.WriteLine($"Loaded event on componentWrapperBase.");
|
||||
|
||||
// Assign handler for the Unloaded lifetime event (attached in code-behind).
|
||||
Unloaded += (object sender, RoutedEventArgs e) =>
|
||||
Debug.WriteLine($"Unloaded event on componentWrapperBase.");
|
||||
}
|
||||
}
|
||||
|
||||
/* Output:
|
||||
Initialized event on textBox1.
|
||||
Initialized event on textBox2.
|
||||
Initialized event on componentWrapperBase.
|
||||
Initialized event on componentWrapper.
|
||||
Initialized event on outerStackPanel.
|
||||
|
||||
Loaded event on outerStackPanel.
|
||||
Loaded event on componentWrapperBase.
|
||||
Loaded event on componentWrapper.
|
||||
Loaded event on textBox1.
|
||||
Loaded event on textBox2.
|
||||
|
||||
Unloaded event on outerStackPanel.
|
||||
Unloaded event on componentWrapperBase.
|
||||
Unloaded event on componentWrapper.
|
||||
Unloaded event on textBox1.
|
||||
Unloaded event on textBox2.
|
||||
*/
|
||||
//</LifetimeEventsCodeBehind>
|
||||
}
|
||||
+63
@@ -0,0 +1,63 @@
|
||||
//------------------------------------------------------------------------------
|
||||
// <auto-generated>
|
||||
// This code was generated by a tool.
|
||||
// Runtime Version:4.0.30319.42000
|
||||
//
|
||||
// Changes to this file may cause incorrect behavior and will be lost if
|
||||
// the code is regenerated.
|
||||
// </auto-generated>
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
namespace CodeSampleCsharp.Properties {
|
||||
using System;
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// A strongly-typed resource class, for looking up localized strings, etc.
|
||||
/// </summary>
|
||||
// This class was auto-generated by the StronglyTypedResourceBuilder
|
||||
// class via a tool like ResGen or Visual Studio.
|
||||
// To add or remove a member, edit your .ResX file then rerun ResGen
|
||||
// with the /str option, or rebuild your VS project.
|
||||
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "17.0.0.0")]
|
||||
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
|
||||
[global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
|
||||
internal class Resources {
|
||||
|
||||
private static global::System.Resources.ResourceManager resourceMan;
|
||||
|
||||
private static global::System.Globalization.CultureInfo resourceCulture;
|
||||
|
||||
[global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")]
|
||||
internal Resources() {
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Returns the cached ResourceManager instance used by this class.
|
||||
/// </summary>
|
||||
[global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
|
||||
internal static global::System.Resources.ResourceManager ResourceManager {
|
||||
get {
|
||||
if (object.ReferenceEquals(resourceMan, null)) {
|
||||
global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("CodeSampleCsharp.Properties.Resources", typeof(Resources).Assembly);
|
||||
resourceMan = temp;
|
||||
}
|
||||
return resourceMan;
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Overrides the current thread's CurrentUICulture property for all
|
||||
/// resource lookups using this strongly typed resource class.
|
||||
/// </summary>
|
||||
[global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
|
||||
internal static global::System.Globalization.CultureInfo Culture {
|
||||
get {
|
||||
return resourceCulture;
|
||||
}
|
||||
set {
|
||||
resourceCulture = value;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
+120
@@ -0,0 +1,120 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<root>
|
||||
<!--
|
||||
Microsoft ResX Schema
|
||||
|
||||
Version 2.0
|
||||
|
||||
The primary goals of this format is to allow a simple XML format
|
||||
that is mostly human readable. The generation and parsing of the
|
||||
various data types are done through the TypeConverter classes
|
||||
associated with the data types.
|
||||
|
||||
Example:
|
||||
|
||||
... ado.net/XML headers & schema ...
|
||||
<resheader name="resmimetype">text/microsoft-resx</resheader>
|
||||
<resheader name="version">2.0</resheader>
|
||||
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
|
||||
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
|
||||
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
|
||||
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
|
||||
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
|
||||
<value>[base64 mime encoded serialized .NET Framework object]</value>
|
||||
</data>
|
||||
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
|
||||
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
|
||||
<comment>This is a comment</comment>
|
||||
</data>
|
||||
|
||||
There are any number of "resheader" rows that contain simple
|
||||
name/value pairs.
|
||||
|
||||
Each data row contains a name, and value. The row also contains a
|
||||
type or mimetype. Type corresponds to a .NET class that support
|
||||
text/value conversion through the TypeConverter architecture.
|
||||
Classes that don't support this are serialized and stored with the
|
||||
mimetype set.
|
||||
|
||||
The mimetype is used for serialized objects, and tells the
|
||||
ResXResourceReader how to depersist the object. This is currently not
|
||||
extensible. For a given mimetype the value must be set accordingly:
|
||||
|
||||
Note - application/x-microsoft.net.object.binary.base64 is the format
|
||||
that the ResXResourceWriter will generate, however the reader can
|
||||
read any of the formats listed below.
|
||||
|
||||
mimetype: application/x-microsoft.net.object.binary.base64
|
||||
value : The object must be serialized with
|
||||
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
|
||||
: and then encoded with base64 encoding.
|
||||
|
||||
mimetype: application/x-microsoft.net.object.soap.base64
|
||||
value : The object must be serialized with
|
||||
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
|
||||
: and then encoded with base64 encoding.
|
||||
|
||||
mimetype: application/x-microsoft.net.object.bytearray.base64
|
||||
value : The object must be serialized into a byte array
|
||||
: using a System.ComponentModel.TypeConverter
|
||||
: and then encoded with base64 encoding.
|
||||
-->
|
||||
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
|
||||
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
|
||||
<xsd:element name="root" msdata:IsDataSet="true">
|
||||
<xsd:complexType>
|
||||
<xsd:choice maxOccurs="unbounded">
|
||||
<xsd:element name="metadata">
|
||||
<xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="value" type="xsd:string" minOccurs="0" />
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" use="required" type="xsd:string" />
|
||||
<xsd:attribute name="type" type="xsd:string" />
|
||||
<xsd:attribute name="mimetype" type="xsd:string" />
|
||||
<xsd:attribute ref="xml:space" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
<xsd:element name="assembly">
|
||||
<xsd:complexType>
|
||||
<xsd:attribute name="alias" type="xsd:string" />
|
||||
<xsd:attribute name="name" type="xsd:string" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
<xsd:element name="data">
|
||||
<xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
|
||||
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
|
||||
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
|
||||
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
|
||||
<xsd:attribute ref="xml:space" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
<xsd:element name="resheader">
|
||||
<xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" type="xsd:string" use="required" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
</xsd:choice>
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
</xsd:schema>
|
||||
<resheader name="resmimetype">
|
||||
<value>text/microsoft-resx</value>
|
||||
</resheader>
|
||||
<resheader name="version">
|
||||
<value>2.0</value>
|
||||
</resheader>
|
||||
<resheader name="reader">
|
||||
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||
</resheader>
|
||||
<resheader name="writer">
|
||||
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||
</resheader>
|
||||
</root>
|
||||
+9
@@ -0,0 +1,9 @@
|
||||
<Application x:Class="Application"
|
||||
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
|
||||
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
|
||||
xmlns:local="clr-namespace:CodeSampleVb"
|
||||
StartupUri="MainWindow.xaml">
|
||||
<Application.Resources>
|
||||
|
||||
</Application.Resources>
|
||||
</Application>
|
||||
+6
@@ -0,0 +1,6 @@
|
||||
Class Application
|
||||
|
||||
' Application-level events, such as Startup, Exit, and DispatcherUnhandledException
|
||||
' can be handled in this file.
|
||||
|
||||
End Class
|
||||
@@ -0,0 +1,9 @@
|
||||
'The ThemeInfo attribute describes where any theme specific and generic resource dictionaries can be found.
|
||||
'1st parameter: where theme specific resource dictionaries are located
|
||||
'(used if a resource is not found in the page,
|
||||
' or application resource dictionaries)
|
||||
|
||||
'2nd parameter: where the generic resource dictionary is located
|
||||
'(used if a resource is not found in the page,
|
||||
'app, and any theme specific resource dictionaries)
|
||||
<Assembly: ThemeInfo(ResourceDictionaryLocation.None, ResourceDictionaryLocation.SourceAssembly)>
|
||||
+23
@@ -0,0 +1,23 @@
|
||||
<Project Sdk="Microsoft.NET.Sdk">
|
||||
|
||||
<PropertyGroup>
|
||||
<OutputType>WinExe</OutputType>
|
||||
<TargetFramework>net6.0-windows</TargetFramework>
|
||||
<RootNamespace>CodeSampleVb</RootNamespace>
|
||||
<NeutralLanguage>en-us</NeutralLanguage>
|
||||
<UseWPF>true</UseWPF>
|
||||
</PropertyGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<Import Include="System.Windows" />
|
||||
<Import Include="System.Windows.Controls" />
|
||||
<Import Include="System.Windows.Data" />
|
||||
<Import Include="System.Windows.Documents" />
|
||||
<Import Include="System.Windows.Input" />
|
||||
<Import Include="System.Windows.Media" />
|
||||
<Import Include="System.Windows.Media.Imaging" />
|
||||
<Import Include="System.Windows.Navigation" />
|
||||
<Import Include="System.Windows.Shapes" />
|
||||
</ItemGroup>
|
||||
|
||||
</Project>
|
||||
+19
@@ -0,0 +1,19 @@
|
||||
<Window x:Class="MainWindow"
|
||||
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
|
||||
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
|
||||
xmlns:custom="clr-namespace:CodeSampleVb"
|
||||
Title="Object lifetime events" Height="100" Width="300">
|
||||
|
||||
<!--<LifetimeEventsXaml>-->
|
||||
<Canvas x:Name="canvas">
|
||||
<StackPanel x:Name="outerStackPanel" Initialized="InitHandler" Loaded="LoadHandler" Unloaded="UnloadHandler">
|
||||
<custom:ComponentWrapper x:Name="componentWrapper" Initialized="InitHandler" Loaded="LoadHandler" Unloaded="UnloadHandler">
|
||||
<TextBox x:Name="textBox1" Initialized="InitHandler" Loaded="LoadHandler" Unloaded="UnloadHandler" />
|
||||
<TextBox x:Name="textBox2" Initialized="InitHandler" Loaded="LoadHandler" Unloaded="UnloadHandler" />
|
||||
</custom:ComponentWrapper>
|
||||
</StackPanel>
|
||||
<Button Content="Remove canvas child elements" Click="Button_Click"/>
|
||||
</Canvas>
|
||||
<!--</LifetimeEventsXaml>-->
|
||||
|
||||
</Window>
|
||||
+80
@@ -0,0 +1,80 @@
|
||||
'<LifetimeEventsCodeBehind>
|
||||
Partial Public Class MainWindow
|
||||
Inherits Window
|
||||
|
||||
Public Sub New()
|
||||
InitializeComponent()
|
||||
End Sub
|
||||
|
||||
' Handler for the Initialized lifetime event (attached in XAML).
|
||||
Private Sub InitHandler(sender As Object, e As EventArgs)
|
||||
Debug.WriteLine($"Initialized event on {CType(sender, FrameworkElement).Name}.")
|
||||
End Sub
|
||||
|
||||
' Handler for the Loaded lifetime event (attached in XAML).
|
||||
Private Sub LoadHandler(sender As Object, e As RoutedEventArgs)
|
||||
Debug.WriteLine($"Loaded event on {CType(sender, FrameworkElement).Name}.")
|
||||
End Sub
|
||||
|
||||
' Handler for the Unloaded lifetime event (attached in XAML).
|
||||
Private Sub UnloadHandler(sender As Object, e As RoutedEventArgs)
|
||||
Debug.WriteLine($"Unloaded event on {CType(sender, FrameworkElement).Name}.")
|
||||
End Sub
|
||||
|
||||
Private Sub Button_Click(sender As Object, e As RoutedEventArgs)
|
||||
' Remove nested controls.
|
||||
canvas.Children.Clear()
|
||||
End Sub
|
||||
End Class
|
||||
|
||||
' Custom control.
|
||||
Public Class ComponentWrapper
|
||||
Inherits ComponentWrapperBase
|
||||
End Class
|
||||
|
||||
' Custom base control.
|
||||
Public Class ComponentWrapperBase
|
||||
Inherits StackPanel
|
||||
|
||||
Public Sub New()
|
||||
' Attach handlers for the lifetime events.
|
||||
AddHandler Initialized, AddressOf InitHandler
|
||||
AddHandler Loaded, AddressOf LoadHandler
|
||||
AddHandler Unloaded, AddressOf UnloadHandler
|
||||
End Sub
|
||||
|
||||
' Handler for the Initialized lifetime event (attached in code-behind).
|
||||
Private Sub InitHandler(sender As Object, e As EventArgs)
|
||||
Debug.WriteLine("Initialized event on componentWrapperBase.")
|
||||
End Sub
|
||||
|
||||
' Handler for the Loaded lifetime event (attached in code-behind).
|
||||
Private Sub LoadHandler(sender As Object, e As RoutedEventArgs)
|
||||
Debug.WriteLine("Loaded event on componentWrapperBase.")
|
||||
End Sub
|
||||
|
||||
' Handler for the Unloaded lifetime event (attached in code-behind).
|
||||
Private Sub UnloadHandler(sender As Object, e As RoutedEventArgs)
|
||||
Debug.WriteLine("Unloaded event on componentWrapperBase.")
|
||||
End Sub
|
||||
End Class
|
||||
|
||||
'Output:
|
||||
'Initialized event on textBox1.
|
||||
'Initialized event on textBox2.
|
||||
'Initialized event on componentWrapperBase.
|
||||
'Initialized event on componentWrapper.
|
||||
'Initialized event on outerStackPanel.
|
||||
|
||||
'Loaded event on outerStackPanel.
|
||||
'Loaded event on componentWrapperBase.
|
||||
'Loaded event on componentWrapper.
|
||||
'Loaded event on textBox1.
|
||||
'Loaded event on textBox2.
|
||||
|
||||
'Unloaded event on outerStackPanel.
|
||||
'Unloaded event on componentWrapperBase.
|
||||
'Unloaded event on componentWrapper.
|
||||
'Unloaded event on textBox1.
|
||||
'Unloaded event on textBox2.
|
||||
'</LifetimeEventsCodeBehind>
|
||||
@@ -80,6 +80,8 @@ items:
|
||||
items:
|
||||
- name: Events
|
||||
items:
|
||||
- name: Object lifetime events
|
||||
href: events/object-lifetime-events.md
|
||||
- name: Marking routed events as handled, and class handling
|
||||
href: events/marking-routed-events-as-handled-and-class-handling.md
|
||||
- name: Preview events
|
||||
|
||||
@@ -353,6 +353,11 @@
|
||||
"SourceUrl": "/dotnet/desktop/wpf/advanced/marking-routed-events-as-handled-and-class-handling?view=netframeworkdesktop-4.8",
|
||||
"TargetUrl": "/dotnet/desktop/wpf/events/marking-routed-events-as-handled-and-class-handling?view=netdesktop-6.0"
|
||||
},
|
||||
{
|
||||
"Redirect": "TwoWay",
|
||||
"SourceUrl": "/dotnet/desktop/wpf/advanced/object-lifetime-events?view=netframeworkdesktop-4.8",
|
||||
"TargetUrl": "/dotnet/desktop/wpf/events/object-lifetime-events?view=netdesktop-6.0"
|
||||
},
|
||||
|
||||
// Systems - Properties
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user