.NET 2.0 and Windows 8

Updated on Thursday, November 12, 2015

Inexplicably .NET 2.0, 3.0 and 3.5 are not installed by default in Windows 8 and can’t be installed using the redistributables that worked with previous versions of Windows. You have to go digging in Windows Features to get anything older than 4.0.

(Related: Going Chrome; Catfood Software Support; WiX Tricks for Screen Savers)

(You might also like: Sweeney Ridge; Siriusly?; Both sides of the Golden Gate, a Time Lapse)

(All Code Posts)

Share a picture in MonoDroid

Updated on Sunday, September 30, 2018

Here’s how to share a picture to Facebook, Twitter and so forth from MonoDroid:

A fun mix of Java and C#. The directory got me to start with so check to see if the ExternalCacheDir is available and if not fall back to the internal CacheDir. Frustratingly Facebook doesn’t pick up on the text associated with an image regardless of the intent ExtraWhatever specified.

(Related: How to backup Google Photos to Google Drive automatically after July 2019 with Apps Script; Get an email when your security camera sees something new (Apps Script + Cloud Vision); Capture DropCam (Nest Cam) frames to Google Drive)

(You might also like: Autumnal Equinox 2021; Build Back Betterer; 4K One Year Global Cloud Timelapse)

(All Code Posts)

Catfood: WebCams for Android

Updated on Sunday, September 5, 2021

Catfood WebCams for Android

I’ve just released a WebCam app for Android. It’s based on WebCamSaver but allows you to control the webcam – you tap the edges of the screen to pan, pinch to zoom in and out. A fun little time waster.

This is the first app I’ve released using Xamarin’s MonoDroid framework. This integrates nicely into Visual Studio and allows you to program an Android app in C#. This is fantastic for productivity and code reuse and I enjoyed the process a lot more than previous work I’ve done in Java / Eclipse. The main drawback is that the framework adds around 5MB (significant for mobile) and the documentation isn’t always the best, especially when you search for something and find out you’ve been dumped into iOS reference material. Digging around the sample code and cross-referencing the official Android documentation helps a lot. I’m going to take a stab at something a little more ambitious next…

(Related: ESRI Shapefile Reader in .NET; Capture DropCam (Nest Cam) frames to Google Drive; The Secret Diary of a Xamarin Android Developer, Aged 48 1/3)

(You might also like: Robot Ahead; A vacation based proof of the many-worlds interpretation of quantum mechanics; Oakland Hills)

(All Code Posts)

Catfood.Shapefile 1.40

Updated on Wednesday, May 5, 2021

I’ve just released a small update to Catfood.Shapefile. Stephan Stapel, who implemented PolyLineM support, has contributed a patch that improves the class hierarchy. CodePlex user originSH suggested supporting the ACE driver for 64-bit systems. I’ve added a constructor overload that allows you to use predefined Jet and ACE connection strings or provide your own templates if necessary. Thanks to Stephan and originSH.

Catfood.Shapefile is a .NET library for enumerating ESRI shapefiles. I originally wrote the library to help me build some complex layers in Catfood Earth. Since then it’s picked up thousands of users and some really valuable suggestions and patches from the CodePlex community. I’m very glad a took a couple of hours to open source the library back in 2009.

(Related: ESRI Shapefile Reader in .NET; Upgrading to BlogEngine.NET 2.5; Is PAD dead?)

(You might also like: Video timeout on XP and Vista (power management); Is it safe to open securedoc.html (Cisco Registered Envelope)?; Even Shitier - Citibank Remortgage Scam)

(All Code Posts)

Convert BlogML comments to WXR for Disqus

Updated on Thursday, November 12, 2015

I’ve just moved ITHCWY comments over to Disqus. BlogEngine.NET now supports Disqus out of the box, but doesn’t export comments to anything that Disqus is willing to eat. I’ve knocked up a quick converter that takes a full BlogML export from BlogEngine.NET (and at least in theory any other source of BlogML) and converts the comments to WXR. You can import the WXR file under the Generic option in Disqus.

The tool is a Windows console application that takes two parameters, the BlogML import file and the WXR output, i.e.:

BlogMLtoDisqus.exe C:\BlogML.xml C:\ForDisqus.wxr

It isn’t fancy and there is no error checking so it will either work or die horribly. If the latter, leave a comment and I’ll try to fix it for you.

Download BlogMLtoDisqus.exe. You’ll need to install .NET 4.0 as well if you don’t already have it.

Updated 2011-04-22: Added an optional third parameter that specifies the XML namespace for BlogML in case you need to override the default.

(Related: Export Google Fit Daily Steps, Weight and Distance to a Google Sheet; Migrating from Blogger to BlogEngine.NET; Using the Azure Monitor REST API from Google Apps Script)

(You might also like: Humpback Whale at Fort Funston; Diary of a Living Room; Summer Solstice 2017)

(All Code Posts)

Merging Resource Dictionaries for fun and profit

Updated on Thursday, April 29, 2021

Here are two scenarios where merged ResourceDictionary objects are the way forward.

I’m working on a WPF project that needs to be single instance. Heaven forbid that the WPF team should pollute the purity of their framework with support for this kind of thing (or NotifyIcon support but that’s another story) so I’m using the code recommended by Arik Poznanski: WPF Single Instance Application. I like this because it both enforces a single instance and provides an interface that reports the command line passed to any attempt to launch another instance.

An issue with using this code is that you need to write a Main function and so App.xaml is set to Page instead of Application Definition. Once you’ve done this the program works fine but the Visual Studio designer fails to load resources in UserControls (and in Windows containing those UserControls).

The fix is to factor all of the application level resources out into a separate ResourceDictionary (i.e. MergedResources.xaml). Once you’ve done this merge the new ResourceDictionary into App.xaml as follows:

Next, in each Window or UserControl reference the same ResourceDictionary:

The designer will now be able to find the correct resources for each UserControl and Window.

The second scenario is factoring resources and other Xaml into a DLL. To pull resources in from a referenced assembly you just need to use a Pack Uri when merging in the remote ResourceDictionary:

If you’re putting Windows and UserControls in the DLL use exactly the same approach to reference the resources using ResourceDictionary.MergedDictionaries and you’ll get designer support for these as well.

(Related: ESRI Shapefile Reader in .NET; Using the Azure Monitor REST API from Google Apps Script; Export Google Fit Daily Steps, Weight and Distance to a Google Sheet)

(You might also like: What if the Senate Voted Proportionally to Population; Automate Google PageSpeed Insights and Core Web Vitals Logging with Apps Script; NailMathAndScienceFirst.org)

(All Code Posts)

UAC shield icon in WPF

Updated on Sunday, May 2, 2021

WPF: When it's good it’s very, very good and when it’s bad it’s like sautéing your own eyeballs.

When you’re about to launch a process that will trigger an elevation prompt it’s polite to decorate it with the little UAC shield so the user knows what to expect. Of course there’s no such capability in WPF, and WPF controls have no handles so you can’t use SendMessage / BCM_SETSHIELD as with Windows Forms.

System.Drawing.SystemIcons.Shield seems promising, but it returns the wrong icon on Windows 7 (at least in .NET 4).

SHGetStockIconInfo will allow you to get the correct icon, but isn’t supported on Windows XP. I’ve just added the necessary interop signatures for SHGetStockIconInfo to pinvoke.net so I won’t duplicate that code here. Once you have the interop you can get the correct icon as a BitmapSource using the following code:

(Related: WiX Tricks for Screen Savers; Export Google Fit Daily Steps, Weight and Distance to a Google Sheet; Using the Azure Monitor REST API from Google Apps Script)

(You might also like: Moon; Installation: Early and Often; Super Flower Blood Moon Eclipse)

(All Code Posts)

Geotagging posts in BlogEngine.NET

Updated on Sunday, September 30, 2018

I've written an extension for BlogEngine.NET that automatically adds several different geographical tags to blog posts. I knocked this up for my Hikes blog. It might be useful for any blog where some of the posts are related to a real world location.

To get started download GeotagFromKML.zip (2.24 kb) and copy GeotagFromKML.cs to the App_Code\Extensions folder in your BlogEngine.NET instance.

The extension does two things. Firstly it looks for a link to a KML file when post is added or updated (it does this because each of my hike posts includes a Google Earth KML file for the hike). If a KML link is found then a paragraph is added to the post containing the longitude and latitude of the first coordinate in the KML file. The paragraph uses the Geo microformat. You can customize the text in settings for the extension. You can also regenerate by deleting the paragraph and saving the post. 

The second function is to add ICBM and Geo Tag META tags when serving a post that contains the geotagged coordinates. You can take advantage of this without linking to a KML file, just include a location like this in your post:

Once you have geotagging up and running you might also want to add GeoURL to the list of ping services for your site.

(Related: BlogEngine.NET most popular pages widget using Google Analytics; How to backup Google Photos to Google Drive automatically after July 2019 with Apps Script; Monitor page index status with Google Sheets, Apps Script and the Google Search Console API)

(You might also like: Timelapse, Week of Jan 31 2022; HOWTO: Fix Twitter; Comparing the Atmosphere to the Population of the United States)

(All Code Posts)

WPF commands with nested focus scope

Updated on Sunday, September 30, 2018

Here's a frustrating WPF scenario — you use the ApplicationCommands class to add Cut, Copy and Paste commands to toolbar and then put a TextBox on another toolbar. Click in the TextBox and the commands remain disabled. WTF, WPF?

The problem is with focus scopes. Your window is a focus scope and so are any menus or toolbars. This has the desirable property of allowing commands to target the control you were in immediately before invoking the command. You want paste to target the text box you're editing, not the menu item or button you clicked to request the paste.

So far so good. The problem is that the commanding system isn't smart enough to target the control with keyboard focus if it's in a nested focus scope. Remember that the window itself is a focus scope so our TextBox in a ToolBar (also a focus scope) is nested and immune to commands from our menu or toolbar.

Here's a simple window that demonstrates the problem:

Ignore the PreviewCanExecute handler for now. If you run this window and click in the main TextBox the paste button and menu item are enabled. Click in the toolbar TextBox and pasting isn't an option. Well, Ctrl-V still works and there's a context menu but you know what I mean.

The problem can be fixed by adding a command binding for ApplicationCommands.Paste and handling the PreviewCanExecute event:

When the window loads we're making note of the focus scopes for the toolbar and menu. Then when PreviewCanExecute fires we check to see if the element with the keyboard focus is in a different focus scope (and also that the window doesn't have keyboard focus). We then set the CommandTarget for the menu item and button to the element that has keyboard focus.

A handler isn't required for CanExecute as the command will take care of this with respect to the new CommandTarget.

Run the window again and you'll see that the paste button is enabled for both of the TextBox controls. When you click the button (or menu item) our PreviewCanExecute handler ignores the new keyboard focus and the command is sent to the desired control. 

One drawback of this approach is that keyboard focus isn't returned to the TextBox after the command executes. The CommandTarget remains in place so you can keep pasting and the command remains enabled but you lose the visual cue that lets you know where the target is. I haven't figured out a clean approach to this yet. When I do, I'll update this post. Better yet, if you've figured it out leave a comment.

(Related: Monitor page index status with Google Sheets, Apps Script and the Google Search Console API; WiX Tricks for Screen Savers; Get an email when your security camera sees something new (Apps Script + Cloud Vision))

(You might also like: 2017 Total Solar Eclipse from Madras, OR; Point Reyes Deer; San Francisco November 2020 Ballot Measures)

(All Code Posts)

Converting Blogger ATOM export to BlogML

Updated on Thursday, December 26, 2019

I'm slowly converting a number of blogs from Blogger to BlogEngine.NET. The least fun part is dealing with the Blogger export file. For this blog I used a Powershell script but had problems with comments not exporting correctly and it was quite painful to fix everything up. Blogger allows you to export a copy of your blog using ATOM, however BlogEngine.NET (and other tools) speak BlogML.

I've just released a command line tool that takes the ATOM format Blogger export and converts it to BlogML. You can download Blogger2BlogML from GitHub. The tool uses .NET 4.0 (client profile) so you'll need to install this if you don't already have it. If you give Blogger2BlogML a try let me know how you get on. 

(Related: Migrating from Blogger to BlogEngine.NET; Export Google Fit Daily Steps, Weight and Distance to a Google Sheet; Capture DropCam (Nest Cam) frames to Google Drive)

(You might also like: I don't always find droids...; Mangler; Convert BlogML comments to WXR for Disqus)

(All Code Posts)