Skip to content

Commit 9db36dd

Browse files
authored
Merge pull request #8 from nathanaw/feature/2.0.0
Feature/2.0.0
2 parents af8dfd3 + 8037ffb commit 9db36dd

File tree

113 files changed

+4044
-5748
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

113 files changed

+4044
-5748
lines changed

.gitignore

+1
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,7 @@ stylecop.*
5454
~$*
5555
*.dbmdl
5656
Generated_Code #added for RIA/Silverlight projects
57+
.vs
5758

5859
############
5960
## Windows

BUILDING.md

+30
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
# Build / Run / Release
2+
3+
4+
## Build Library and Tests
5+
6+
Note: The solution includes projects that only run properly on windows machines.
7+
8+
1. Clone repo
9+
2. Open bash shell in root directory of git repo
10+
2. `dotnet build tests/MonitoredUndo.Tests/MonitoredUndo.Tests.csproj`
11+
3. `dotnet test tests/MonitoredUndo.Tests/MonitoredUndo.Tests.csproj`
12+
13+
## Release
14+
15+
The solution and projects use the "Directory.Build.props" feature to keep solution-wide
16+
values in the root of the solution.
17+
18+
To create a Pre-Release nuget package:
19+
20+
1. Build the library and run tests as above.
21+
2. `dotnet pack src/MonitoredUndo/MonitoredUndo.csproj --version-suffix "alpha.1" --include-source --include-symbols`
22+
3. Upload the package from `src/MonitoredUndo/Debug/` to nuget.
23+
24+
25+
To create a Release nuget package:
26+
27+
1. Build the library and run tests as above.
28+
2. `dotnet pack src/MonitoredUndo/MonitoredUndo.csproj --configuration Release --include-source --include-symbols`
29+
3. Upload the package from `src/MonitoredUndo/Release/` to nuget.
30+

Directory.Build.props

+37
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
<?xml version="1.0" encoding="utf-8"?>
2+
3+
<!--
4+
These properties are auto-imported into projects in child directories.
5+
-->
6+
7+
<Project>
8+
9+
<PropertyGroup Label="Build">
10+
<Features>IOperation</Features>
11+
<DebugType>Full</DebugType>
12+
13+
<!-- Sets the primary part of the version (before the suffix) for all projects in the solution. -->
14+
<VersionPrefix>2.0.0</VersionPrefix>
15+
</PropertyGroup>
16+
17+
<!-- Support nuget pre-release packaging -->
18+
<PropertyGroup Label="Package: Release" Condition="'$(VersionSuffix)' == ''">
19+
<Version>$(VersionPrefix)</Version>
20+
</PropertyGroup>
21+
22+
<PropertyGroup Label="Package: Snapshot" Condition="'$(VersionSuffix)' != ''">
23+
<Version>$(VersionPrefix)-$(VersionSuffix)</Version>
24+
</PropertyGroup>
25+
26+
<PropertyGroup Label="Metadata">
27+
<Authors>Nathan Allen-Wagner</Authors>
28+
<Copyright>Copyright © Alner LLC 2020</Copyright>
29+
<Description>Monitored Undo Framework</Description>
30+
<Title>Monitored Undo Framework</Title>
31+
</PropertyGroup>
32+
33+
<ItemGroup Label="Analyzers">
34+
<PackageReference Include="Microsoft.CodeAnalysis.FxCopAnalyzers" Version="2.6.3" PrivateAssets="all" />
35+
</ItemGroup>
36+
37+
</Project>
Original file line numberDiff line numberDiff line change
@@ -1,84 +1,104 @@
1-
2-
Microsoft Visual Studio Solution File, Format Version 12.00
3-
# Visual Studio 2013
4-
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MonitoredUndo", "MonitoredUndo\MonitoredUndo.csproj", "{FF127A9A-BACB-4BC3-99DE-9F80275A06D4}"
5-
EndProject
6-
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MonitoredUndoTests", "MonitoredUndoTests\MonitoredUndoTests.csproj", "{876B42D2-67E8-45B5-886C-9AB8C75E76C4}"
7-
EndProject
8-
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{7C8B148F-D9DF-4838-AA00-E267C3A9172A}"
9-
ProjectSection(SolutionItems) = preProject
10-
BuildAll.cmd = BuildAll.cmd
11-
Local.testsettings = Local.testsettings
12-
Monitored Undo Framework.vsmdi = Monitored Undo Framework.vsmdi
13-
EndProjectSection
14-
EndProject
15-
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "WpfUndoSample", "WpfUndoSample\WpfUndoSample.csproj", "{5AF2EE5C-BE23-49A6-A850-FE04BB0DAF6D}"
16-
EndProject
17-
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = ".nuget", ".nuget", "{6111F735-85C7-4340-8327-68CF3D4E17BB}"
18-
ProjectSection(SolutionItems) = preProject
19-
.nuget\NuGet.Config = .nuget\NuGet.Config
20-
.nuget\NuGet.exe = .nuget\NuGet.exe
21-
.nuget\NuGet.targets = .nuget\NuGet.targets
22-
.nuget\packages.config = .nuget\packages.config
23-
EndProjectSection
24-
EndProject
25-
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "WpfUndoSampleMVVM", "WpfUndoSampleMVVM\WpfUndoSampleMVVM.csproj", "{86B5DDDF-EEE5-4265-BC5D-88EB558F12B4}"
26-
EndProject
27-
Global
28-
GlobalSection(TestCaseManagementSettings) = postSolution
29-
CategoryFile = Monitored Undo Framework.vsmdi
30-
EndGlobalSection
31-
GlobalSection(SolutionConfigurationPlatforms) = preSolution
32-
Debug|Any CPU = Debug|Any CPU
33-
Debug|Mixed Platforms = Debug|Mixed Platforms
34-
Debug|x86 = Debug|x86
35-
Release|Any CPU = Release|Any CPU
36-
Release|Mixed Platforms = Release|Mixed Platforms
37-
Release|x86 = Release|x86
38-
EndGlobalSection
39-
GlobalSection(ProjectConfigurationPlatforms) = postSolution
40-
{FF127A9A-BACB-4BC3-99DE-9F80275A06D4}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
41-
{FF127A9A-BACB-4BC3-99DE-9F80275A06D4}.Debug|Any CPU.Build.0 = Debug|Any CPU
42-
{FF127A9A-BACB-4BC3-99DE-9F80275A06D4}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
43-
{FF127A9A-BACB-4BC3-99DE-9F80275A06D4}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
44-
{FF127A9A-BACB-4BC3-99DE-9F80275A06D4}.Debug|x86.ActiveCfg = Debug|Any CPU
45-
{FF127A9A-BACB-4BC3-99DE-9F80275A06D4}.Release|Any CPU.ActiveCfg = Release|Any CPU
46-
{FF127A9A-BACB-4BC3-99DE-9F80275A06D4}.Release|Any CPU.Build.0 = Release|Any CPU
47-
{FF127A9A-BACB-4BC3-99DE-9F80275A06D4}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
48-
{FF127A9A-BACB-4BC3-99DE-9F80275A06D4}.Release|Mixed Platforms.Build.0 = Release|Any CPU
49-
{FF127A9A-BACB-4BC3-99DE-9F80275A06D4}.Release|x86.ActiveCfg = Release|Any CPU
50-
{876B42D2-67E8-45B5-886C-9AB8C75E76C4}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
51-
{876B42D2-67E8-45B5-886C-9AB8C75E76C4}.Debug|Any CPU.Build.0 = Debug|Any CPU
52-
{876B42D2-67E8-45B5-886C-9AB8C75E76C4}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
53-
{876B42D2-67E8-45B5-886C-9AB8C75E76C4}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
54-
{876B42D2-67E8-45B5-886C-9AB8C75E76C4}.Debug|x86.ActiveCfg = Debug|Any CPU
55-
{876B42D2-67E8-45B5-886C-9AB8C75E76C4}.Release|Any CPU.ActiveCfg = Release|Any CPU
56-
{876B42D2-67E8-45B5-886C-9AB8C75E76C4}.Release|Any CPU.Build.0 = Release|Any CPU
57-
{876B42D2-67E8-45B5-886C-9AB8C75E76C4}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
58-
{876B42D2-67E8-45B5-886C-9AB8C75E76C4}.Release|Mixed Platforms.Build.0 = Release|Any CPU
59-
{876B42D2-67E8-45B5-886C-9AB8C75E76C4}.Release|x86.ActiveCfg = Release|Any CPU
60-
{5AF2EE5C-BE23-49A6-A850-FE04BB0DAF6D}.Debug|Any CPU.ActiveCfg = Debug|x86
61-
{5AF2EE5C-BE23-49A6-A850-FE04BB0DAF6D}.Debug|Mixed Platforms.ActiveCfg = Debug|x86
62-
{5AF2EE5C-BE23-49A6-A850-FE04BB0DAF6D}.Debug|Mixed Platforms.Build.0 = Debug|x86
63-
{5AF2EE5C-BE23-49A6-A850-FE04BB0DAF6D}.Debug|x86.ActiveCfg = Debug|x86
64-
{5AF2EE5C-BE23-49A6-A850-FE04BB0DAF6D}.Debug|x86.Build.0 = Debug|x86
65-
{5AF2EE5C-BE23-49A6-A850-FE04BB0DAF6D}.Release|Any CPU.ActiveCfg = Release|x86
66-
{5AF2EE5C-BE23-49A6-A850-FE04BB0DAF6D}.Release|Mixed Platforms.ActiveCfg = Release|x86
67-
{5AF2EE5C-BE23-49A6-A850-FE04BB0DAF6D}.Release|Mixed Platforms.Build.0 = Release|x86
68-
{5AF2EE5C-BE23-49A6-A850-FE04BB0DAF6D}.Release|x86.ActiveCfg = Release|x86
69-
{5AF2EE5C-BE23-49A6-A850-FE04BB0DAF6D}.Release|x86.Build.0 = Release|x86
70-
{86B5DDDF-EEE5-4265-BC5D-88EB558F12B4}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
71-
{86B5DDDF-EEE5-4265-BC5D-88EB558F12B4}.Debug|Any CPU.Build.0 = Debug|Any CPU
72-
{86B5DDDF-EEE5-4265-BC5D-88EB558F12B4}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
73-
{86B5DDDF-EEE5-4265-BC5D-88EB558F12B4}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
74-
{86B5DDDF-EEE5-4265-BC5D-88EB558F12B4}.Debug|x86.ActiveCfg = Debug|Any CPU
75-
{86B5DDDF-EEE5-4265-BC5D-88EB558F12B4}.Release|Any CPU.ActiveCfg = Release|Any CPU
76-
{86B5DDDF-EEE5-4265-BC5D-88EB558F12B4}.Release|Any CPU.Build.0 = Release|Any CPU
77-
{86B5DDDF-EEE5-4265-BC5D-88EB558F12B4}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
78-
{86B5DDDF-EEE5-4265-BC5D-88EB558F12B4}.Release|Mixed Platforms.Build.0 = Release|Any CPU
79-
{86B5DDDF-EEE5-4265-BC5D-88EB558F12B4}.Release|x86.ActiveCfg = Release|Any CPU
80-
EndGlobalSection
81-
GlobalSection(SolutionProperties) = preSolution
82-
HideSolutionNode = FALSE
83-
EndGlobalSection
84-
EndGlobal
1+
2+
Microsoft Visual Studio Solution File, Format Version 12.00
3+
# Visual Studio Version 16
4+
VisualStudioVersion = 16.0.29806.167
5+
MinimumVisualStudioVersion = 10.0.40219.1
6+
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = ".assets", ".assets", "{7C8B148F-D9DF-4838-AA00-E267C3A9172A}"
7+
ProjectSection(SolutionItems) = preProject
8+
.gitignore = .gitignore
9+
BUILDING.md = BUILDING.md
10+
Directory.Build.props = Directory.Build.props
11+
license.md = license.md
12+
README.md = README.md
13+
EndProjectSection
14+
EndProject
15+
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "docs", "docs", "{58941425-BFC3-4DC9-8A6C-EDD42B8A9FDB}"
16+
ProjectSection(SolutionItems) = preProject
17+
docs\ClassDiagram.png = docs\ClassDiagram.png
18+
docs\README.md = docs\README.md
19+
EndProjectSection
20+
EndProject
21+
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "src", "src", "{F1F7AC76-9E13-4D8B-93E8-6AD4DAAF599C}"
22+
EndProject
23+
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "tests", "tests", "{52ADFB30-284E-4673-87BC-30FBCA144471}"
24+
EndProject
25+
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "samples", "samples", "{3A82FA65-EE92-400B-B002-64AE2B8A91DF}"
26+
EndProject
27+
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "MonitoredUndo", "src\MonitoredUndo\MonitoredUndo.csproj", "{FF127A9A-BACB-4BC3-99DE-9F80275A06D4}"
28+
EndProject
29+
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "MonitoredUndo.Tests", "tests\MonitoredUndo.Tests\MonitoredUndo.Tests.csproj", "{876B42D2-67E8-45B5-886C-9AB8C75E76C4}"
30+
EndProject
31+
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "WpfUndoSample", "samples\WpfUndoSample\WpfUndoSample.csproj", "{5AF2EE5C-BE23-49A6-A850-FE04BB0DAF6D}"
32+
EndProject
33+
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "WpfUndoSampleMVVM.Core", "samples\WpfUndoSampleMVVM.Core\WpfUndoSampleMVVM.Core.csproj", "{0AFB4172-7839-419B-A434-E77E87071853}"
34+
EndProject
35+
Global
36+
GlobalSection(SolutionConfigurationPlatforms) = preSolution
37+
Debug|Any CPU = Debug|Any CPU
38+
Debug|Mixed Platforms = Debug|Mixed Platforms
39+
Debug|x86 = Debug|x86
40+
Release|Any CPU = Release|Any CPU
41+
Release|Mixed Platforms = Release|Mixed Platforms
42+
Release|x86 = Release|x86
43+
EndGlobalSection
44+
GlobalSection(ProjectConfigurationPlatforms) = postSolution
45+
{FF127A9A-BACB-4BC3-99DE-9F80275A06D4}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
46+
{FF127A9A-BACB-4BC3-99DE-9F80275A06D4}.Debug|Any CPU.Build.0 = Debug|Any CPU
47+
{FF127A9A-BACB-4BC3-99DE-9F80275A06D4}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
48+
{FF127A9A-BACB-4BC3-99DE-9F80275A06D4}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
49+
{FF127A9A-BACB-4BC3-99DE-9F80275A06D4}.Debug|x86.ActiveCfg = Debug|Any CPU
50+
{FF127A9A-BACB-4BC3-99DE-9F80275A06D4}.Release|Any CPU.ActiveCfg = Release|Any CPU
51+
{FF127A9A-BACB-4BC3-99DE-9F80275A06D4}.Release|Any CPU.Build.0 = Release|Any CPU
52+
{FF127A9A-BACB-4BC3-99DE-9F80275A06D4}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
53+
{FF127A9A-BACB-4BC3-99DE-9F80275A06D4}.Release|Mixed Platforms.Build.0 = Release|Any CPU
54+
{FF127A9A-BACB-4BC3-99DE-9F80275A06D4}.Release|x86.ActiveCfg = Release|Any CPU
55+
{876B42D2-67E8-45B5-886C-9AB8C75E76C4}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
56+
{876B42D2-67E8-45B5-886C-9AB8C75E76C4}.Debug|Any CPU.Build.0 = Debug|Any CPU
57+
{876B42D2-67E8-45B5-886C-9AB8C75E76C4}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
58+
{876B42D2-67E8-45B5-886C-9AB8C75E76C4}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
59+
{876B42D2-67E8-45B5-886C-9AB8C75E76C4}.Debug|x86.ActiveCfg = Debug|Any CPU
60+
{876B42D2-67E8-45B5-886C-9AB8C75E76C4}.Release|Any CPU.ActiveCfg = Release|Any CPU
61+
{876B42D2-67E8-45B5-886C-9AB8C75E76C4}.Release|Any CPU.Build.0 = Release|Any CPU
62+
{876B42D2-67E8-45B5-886C-9AB8C75E76C4}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
63+
{876B42D2-67E8-45B5-886C-9AB8C75E76C4}.Release|Mixed Platforms.Build.0 = Release|Any CPU
64+
{876B42D2-67E8-45B5-886C-9AB8C75E76C4}.Release|x86.ActiveCfg = Release|Any CPU
65+
{5AF2EE5C-BE23-49A6-A850-FE04BB0DAF6D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
66+
{5AF2EE5C-BE23-49A6-A850-FE04BB0DAF6D}.Debug|Any CPU.Build.0 = Debug|Any CPU
67+
{5AF2EE5C-BE23-49A6-A850-FE04BB0DAF6D}.Debug|Mixed Platforms.ActiveCfg = Debug|x86
68+
{5AF2EE5C-BE23-49A6-A850-FE04BB0DAF6D}.Debug|Mixed Platforms.Build.0 = Debug|x86
69+
{5AF2EE5C-BE23-49A6-A850-FE04BB0DAF6D}.Debug|x86.ActiveCfg = Debug|x86
70+
{5AF2EE5C-BE23-49A6-A850-FE04BB0DAF6D}.Debug|x86.Build.0 = Debug|x86
71+
{5AF2EE5C-BE23-49A6-A850-FE04BB0DAF6D}.Release|Any CPU.ActiveCfg = Release|x86
72+
{5AF2EE5C-BE23-49A6-A850-FE04BB0DAF6D}.Release|Mixed Platforms.ActiveCfg = Release|x86
73+
{5AF2EE5C-BE23-49A6-A850-FE04BB0DAF6D}.Release|Mixed Platforms.Build.0 = Release|x86
74+
{5AF2EE5C-BE23-49A6-A850-FE04BB0DAF6D}.Release|x86.ActiveCfg = Release|x86
75+
{5AF2EE5C-BE23-49A6-A850-FE04BB0DAF6D}.Release|x86.Build.0 = Release|x86
76+
{0AFB4172-7839-419B-A434-E77E87071853}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
77+
{0AFB4172-7839-419B-A434-E77E87071853}.Debug|Any CPU.Build.0 = Debug|Any CPU
78+
{0AFB4172-7839-419B-A434-E77E87071853}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
79+
{0AFB4172-7839-419B-A434-E77E87071853}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
80+
{0AFB4172-7839-419B-A434-E77E87071853}.Debug|x86.ActiveCfg = Debug|Any CPU
81+
{0AFB4172-7839-419B-A434-E77E87071853}.Debug|x86.Build.0 = Debug|Any CPU
82+
{0AFB4172-7839-419B-A434-E77E87071853}.Release|Any CPU.ActiveCfg = Release|Any CPU
83+
{0AFB4172-7839-419B-A434-E77E87071853}.Release|Any CPU.Build.0 = Release|Any CPU
84+
{0AFB4172-7839-419B-A434-E77E87071853}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
85+
{0AFB4172-7839-419B-A434-E77E87071853}.Release|Mixed Platforms.Build.0 = Release|Any CPU
86+
{0AFB4172-7839-419B-A434-E77E87071853}.Release|x86.ActiveCfg = Release|Any CPU
87+
{0AFB4172-7839-419B-A434-E77E87071853}.Release|x86.Build.0 = Release|Any CPU
88+
EndGlobalSection
89+
GlobalSection(SolutionProperties) = preSolution
90+
HideSolutionNode = FALSE
91+
EndGlobalSection
92+
GlobalSection(NestedProjects) = preSolution
93+
{FF127A9A-BACB-4BC3-99DE-9F80275A06D4} = {F1F7AC76-9E13-4D8B-93E8-6AD4DAAF599C}
94+
{876B42D2-67E8-45B5-886C-9AB8C75E76C4} = {52ADFB30-284E-4673-87BC-30FBCA144471}
95+
{5AF2EE5C-BE23-49A6-A850-FE04BB0DAF6D} = {3A82FA65-EE92-400B-B002-64AE2B8A91DF}
96+
{0AFB4172-7839-419B-A434-E77E87071853} = {3A82FA65-EE92-400B-B002-64AE2B8A91DF}
97+
EndGlobalSection
98+
GlobalSection(ExtensibilityGlobals) = postSolution
99+
SolutionGuid = {E2B57A17-7A82-4907-91F3-69A1CAF1EA7E}
100+
EndGlobalSection
101+
GlobalSection(TestCaseManagementSettings) = postSolution
102+
CategoryFile = Monitored Undo Framework.vsmdi
103+
EndGlobalSection
104+
EndGlobal

README.md

+13-21
Original file line numberDiff line numberDiff line change
@@ -1,31 +1,23 @@
11
# Monitored Undo Framework
2-
Monitored Undo is an Undo / Redo framework that makes it simple for .NET developers to add
3-
Undo capabilities to an application. The framework "monitors" changes to the model, keeps a
4-
history of undo / redo operations, and assists with applying an undo back to the model.
5-
6-
# Quick Start...
7-
To get a quick idea of how it works, check out the unit tests and the sample model classes.
2+
Monitored Undo is a .NET Standard 2.0 Undo / Redo framework. The framework "monitors" changes
3+
to the model, keeps a history of undo / redo operations, and assists with applying an undo
4+
back to the model.
85

96
# Documentation
107
Please refer to the [documentation folder](docs/) in the repo for details on usage.
118

12-
# Sample Application...
9+
## Quick Start...
10+
To get a quick idea of how it works, check out the unit tests and the sample model classes.
11+
12+
## Sample Application
1313
There is a WPF Sample application in the source code tree. This is a very simple app that
1414
shows a couple features of the undo framework. It does not follow best practices, but does
1515
illustrate how to hook things up.
1616

17-
# Reference Application...
18-
For a more complete example application, please check out my Photo Tagger app. I created
19-
this for a .NET Special Interest Group presentation. It covers my "WPF Tales from the
20-
Trenches", including Undo. You can find the
21-
[Photo Tagger reference app](http://blog.alner.net/archive/2010/10/13/wpf_ef_4_sig_presentation_2010.aspx)
22-
on my [blog](http://blog.alner.net).
23-
24-
# Now on NuGet...
25-
MUF is available on NuGet. You can view details on the
26-
[NuGet Gallery](http://nuget.org/List/Packages/MUF) or search for it in the Add Library
27-
Reference... dialog via Visual Studio.
28-
29-
For you command line types, it's on NuGet as "MUF".
17+
## Reference Application
18+
For a more complete example application, consider the
19+
[Photo Tagger reference app](https://nathan.alner.net/2010/10/13/wpf-amp-entity-framework-4-tales-from-the-trenches/)
20+
sample application. It was created for a presentation related to WPF applications, EF, and undo.
3021

31-
`PM> Install-Package MUF`
22+
# NuGet
23+
MUF is [available on NuGet](http://nuget.org/List/Packages/MUF).

0 commit comments

Comments
 (0)