Overcoming Problems in the Unified API Upgrade

I recently upgraded my Xamarin.Mac application to the unified API. This allows for a single code base that works on 32 and 64 bit applications. But besides that its needed to put anything in the app store. As of Feb 1, 2015 Apple requires that all new submissions to the app store must be 64 bit applications. Since the classic API is limited to 32-bits only this is necessary to get your app in the reach of others.


Go to Project > Migrate to Xamarin.Mac Unified API

Afterward some of my packages had error flags by them. I chose to update my packages.

When I went to Run the project a dialog appeared saying, "The application has not been built". I finally overcame this issue by renaming my project. I had a project with a "." in the name. I switched to an underscore and it finally built.

Steps to Rename a Project

  1. For your project go to Options. Under General > Main Settings change the Name and Default Namespace. Under Build > Output change Assembly Name.
  2. Open a cs file. Select the namespace. Rename it with the Refractor option.
  3. Next, right-click (or ctrl-click) on the project and choose Open Folder Location. At this point be sure to fully exit Xamarin Studio. Rename the project folder. Open the sln file in a text editor and adjust the project’s file path to account for the change.
  4. Delete bin and obj folders
  5. Re-open the solution and build the project

I follow the same steps when I rename a project in Visual Studio too.


The next issue I came across concerned SignalR. It was no longer working. From a try/catch I received this error, "Could not load file or assembly 'System.Net.Http' or one of its dependencies." So I removed my SignalR Client Nuget. When I reinstalled it a few more dependencies were added. Now when I built my application I got 3 errors concerning assembly names that have already been imported. The message resembled, "An assembly with the same identity ‘System.Threading.Tasks, Version…" This problem seemed to come from the new Microsoft.BCL dependency package. The 3 DLLs in question were:

  • System.Threading.Tasks
  • System.IO
  • System.Runtime

Searching online people were suggesting altering the app.config file. I didn’t have any luck with that. I searched for other nugets that had been altered to work in this scenario. No such luck. Finally, I looked in the simplest of places. I went to References > Edit References. Under the .NET Assembly tab the 3 DLLs were listed. I unchecked them and tried again. It worked like a champ. SignalR connectivity was fully restored.

Read More

Cancel/Abort a Closing Window in Xamarin.Mac

Close Dialog

I began by researching the WillClose event to accomplish this. With it I could detect the window as it was closing but could not find a way to abort with the EventArgs provided. I achieved success with a delegate class that overrides the WindowShouldClose method .
Put this class in the window.cs below the partial class that was pregenerated:

Assign the delegate wherever you instantiate the window controller:

Read More

Comparing C# Objects

There are times when you need to compare objects. Microsoft includes a built-in Equals function. When it comes to comparing instantiated objects it will return False unless the two objects are the result of the same instantiation. If your definition of equality is the two objects of the same type with the same property values then you need to implement a different approach. I typically serialize the object then compare the string values.

The JsonConvert object is included with the Json.NET nuget.

Read More

Center a Window in Xamarin.Mac

To make my window appear front, centered and focused I have had success with the following:

This works exceptionally well when invoked from a NSStatusBarItem.

Read More

Add Code Behind to a Resource Dictionary

I recently used a Resource Dictionary and wanted to be able to tweak the xaml components on it behind the scenes. This can be accomplished fairly easily:

  1. In your project add a new class file. Give it the same name as the xaml.
  2. In the newly created file override the contents of the namespace with this code:
  3. Next, go to your <ResourceDictionary> tag in the xaml file. Add this property with the appropriate namespace and name: x:Class="namespace.classname"

Now the two should be linked up. In Visual Studio, however, they will not be nested like normal xaml files. This bugged me. I read online that the csproj file can be edited in notepad to accomplish this. I tried and for some reason I couldn’t get it to take. I did have success with VSCommands. It is an install that adds extra features to Visual Studio. Once installed select the xaml and cs with your mouse in the tree. Right-click and choose Group Items. Choose the xaml as the root item to be conventional. Now Solution Explorer should show them as paired.

Read More

Invert the Transparency in an Image with Gimp

You can easily invert the transparent parts of an image with Gimp. Gimp is an open source Photoshop alternative.

Follow these steps:
  1. Choose Colors -> Components -> Decompose from the menu and set Color model to RGBA.
  2. A new image is opened with all color channels (including alpha channel) decomposed as single layers.
  3. Select the layer alpha and choose Colors -> Invert from the menu.
  4. Choose Colors -> Components -> Compose from the menu, set Color model to RGBA and make sure the layers are correctly mapped to the channels (should default correctly if you did not reorder the layers)

It will open a few new Gimp tabs but it will, indeed, invert the transparent areas of the image. This worked well for me on an image of a single color with transparency.

Read More

How to Queue up Method Calls in C#

First you need to instantiate a List of type Action:

Next, we will add methods to the list. We do this through Lambda Expressions using a specific syntax: () => { TestFunc("data") };

With this technique local methods can be stored along with parameters for future execution. In the example below you can see two Console.WriteLine statements. But since the first method is housed in the expression it does not fire until executed later. However, the subsequent one will fire immediately and be listed first in the output tab of Visual Studio:

To fire off each method loop through and use function params to execute:


Read More

Perform Scheduled Table Maintenance in SQL Server

Have you ever had a need to do routine maintenance on your database tables? For instance, moving older records to history, fixing anomalies, removing bad/incomplete data, updating flags under certain conditions, etc. These types of recurrent tasks can be implemented easily within SQL Server Management Studio (SSMS). With an SSMS component known as SQL Server Agent you can execute T-SQL statements on a repetitive schedule.

SQL Server Agent can be found at the bottom of the Object Explorer pane. Right-click on it and select New > Job. A window pops up to specify the name of your job with some other defaults. Notice the options on the left-hand side. This tutorial touches on the Steps and Schedules options.

Click on Steps. In the window that appears click the New button. A dialog will appear as follows:

SQL Agent Steps New Dialog

In the dialog you can select your database and enter T-SQL statements to perform the job. For example:
or even a stored procedure:

I recently created a job to maintain several tables. Then for each step I provided the T-SQL needed to do my maintenance on each table. Steps can be deleted individually and re-ordered.

Next, you need to set the schedule. Click on Schedules and click the New button. There are many options here to customize the run time to your liking:

SQL Agent Schedule New Dialog

Finally, save the job to make it live. And that’s it. You have created a table in an environment that can perform further automation. There is obviously many more options to explore in SQL Agent. This is just a taste.

Read More

Better Image Previews in HTML5

When working with an uploader it’s nice to show image previews of files before the actual upload takes place. It looks nice and verifies to the user that the correct files have been selected from their computer. Since they are local files people expect them to render immediately. This article details how I accomplished this in HTML5 without the use of flash, silverlight or any other dependent technology.

Over the last several weeks I’ve been researching Plupload for image uploads. They have a nice, ready-made widget but it didn’t quite capture the look and feel that was requested of me. I opted to rely on their API and do the interfacing myself, which included developing my own image previews.

My main requirement was for them to render quick, even with 20MB files. My project was tailored to professional photographers so big files were expected. Searching the web I tried a few techniques that seemed to perform well with small files but would max out resources for larger ones. Things became choppy. A page quickly looks cheap when buttons don’t respond to clicks, content freezes intermediately, etc. I had to come up with a different solution. Along with speed, I also wanted to keep consistent thumbnail sizes and perform ideal cropping. Image quality had to be fair and recognizable as well.

The first function handles proportional resizing. I needed to be able to retrieve lower dimensions that didn’t skew or distort an image:
In most cases you’ll end up with one property that meets the max, but the other dimension will be much smaller than its max. For thumbnails to look clean you need a consistent width and height for every image. So that means you will likely need to crop. But you don’t necessarily want to perform that action on the entire image. Everything becomes so small it becomes hard to read. Rather grab a portion of the image as your scaling down. The following function utilizes proportionalResize as it determines the best coordinates for presenting your image:
Finally, we get to the meat of the process. This function returns the preview as a <canvas> element for your page. A <canvas> tag resembles an <img> tag with one big difference. Instead of loading the image from the network it’s drawn via JavaScript. It also has a built-in cropping mechanism. If using Plupload pass the result of file.getNative(). If not refer to this resource for getting a FileList of File objects to be passed in individually. This function calls the aforementioned centerCropFit function:
Originally, I tried Filereader.readAsDataURL() which converts the entire file into base64-encoded string. Whenever I assigned it to the src of an image it would cause a big memory hit for large files. Attempts to use window.setTimeout() to get around the heavy processing did not help. I also explored Web Workers to no avail. The URL.createObjectURL() method is the nitrous behind this process and allowed the tool to perform well for the user.

Read More

Ensuring Variable Integrity in Async Callback Functions

Callback functions to asynchronous requests may need to reference variables outside of itself. This can be problematic because those variables might not maintain the values you expect by the time the callback function fires. In the past I’ve dealt with this by writing my code as a string, concatenating my variable values, then using eval on it in the callback. I never liked this technique because it seemed amateur, risky and unreliable for complex scenarios. Recently I came across a clever solution that seems to work quite well:
Here we wrap a function around the code, and execute it immediately passing the target variables into it. In my example the variables are file and uploader. Next, we then have an inner function that keeps the meat of our code from being executed immediately. It will be executed in the callback of the asynchronous process…but can reference the variables passed to it’s wrapper function. In the example I have used the same variable names again (no need to change them). I believe the technique duplicates the variables into a local scope where its values can be maintained.

Here is a FIDDLE showcasing the technique. Enjoy.

Read More