>

tisdag 14 juni 2016

Lättare syntax för Converters i WPF/XAML

När du skriver din xaml kod och inser att du behöver en converter till ditt vymodellsvärde är det några steg som behöver göras:
- Om du inte redan har en converter för mappningen, gå och skapa den.
- importera namespacet i xaml koden.
- skapa en instance av convertern i vald Resource collection.
- gör din binding med converten.
Med en singelton Converter kan du förenkla detta något. Lägg till följande klass till ditt xaml projekt:
public abstract class ValueConverter<T> : IValueConverter
  where T : new()
{
 private static T _instance;
 public static T Instance
 {
  get
  {
   if (_instance == null)
    _instance = new T();
   return _instance;
  }
 }

 public abstract object Convert(object value,
Type targetType, object param, CultureInfo cu);

 public virtual object ConvertBack(object value,
Type targetType, object param, CultureInfo cu)
 {
  throw new NotImplementedException();
 }
}
När du sedan behöver en converter (eller vill uppgradera din befintliga converters) ärver du från ovanstående generiska basklass likt nedan:
public class BooleanToColorConverter : 
 ValueConverter<BooleanToColorConverter >
{
 public override object Convert(object value, 
Type targetType, object param, CultureInfo cu)
 {
  var booleanValue =  value as Boolean?;
 if (booleanValue.HasValue)
  {
   return booleanValue.Value ? 
   Colors.Green : Colors.Red;
  }
  return Colors.Red;
 }

 public override object ConvertBack(object value,
 Type targetType, object param, CultureInfo cu)
 {
  //only write this if you need it
 }
}
När du sedan ska använda den använder du x:Static syntaxen enligt nedan:
 <StackPanel Background="{Binding Valid, 
Converter={x:Static local:BooleanToColorConverter.Instance}}"> 
<StackPanel>
alternativt:
<StackPanel Background="">
 <Binding 
converter="{x:Static local:BooleanToColorConverter.Instance}"/>
   </StackPanel>
  </StackPanel>
Teorin går även att applicera på multiconverters.

fredag 27 maj 2016

Hur du skapar en Azure Remoteapp

Microsoft: -We will continue to support existing Azure RemoteApp customers on the service through August 31st, 2017, when the service will be wound down. We are following up directly with customers who are currently using Azure RemoteApp to ensure these options are understood and they have the support they need through this transition. New purchases of Azure RemoteApp will end as of October 1st, 2016.

Med Azure Remoteapps kan du köra en windows applikation även på iOS och Android. Tekniken ger också enkelt sätt för användarna på windows plattformen att nå sina applikationer. Dock finns det några saker som windows applikationen måste uppfylla: App requirements.
Denna guide visar hur du skapar en Remoteapp med hjälp av en VM skapad i Azure, detta är att föredra då det finns några krav på själva VM:en som används för detta och det finns en bra mall i bland Azure VM:arna.
Gå först till Azure portalen.
I portalen skapar du en ny VM. Använd sökordet “remote” i filtret för att hitta “Windows Server Remote Desktop Session Host on Windows Server 2012 R2”. När du skapar denna VM är det viktigt att du i deployment modellen väljer classic.

newVMRemote

När VM:en sedan är skapad återfinner du den under “Virtual machines (classic)”, därifrån kan du nu ansluta till den genom att använda connect knappen (använd kontot som du skapade):

connect

På maskinen installerar du nu den eller de program som du önskar köra via Remote apps. Skriv sedan upp sökvägen till dessa program.
När du är klar använder du genvägen på skrivbordet (som du bara har om du valde rätt VMs mall):

shortcut

Detta startar en powershell script som först kontrollerar att VM:en uppfyller kraven som behövs för en VM som skall användas för Remoteapp. Scriptet kommer sedan fråga om du vill göra en sysprep och då svarar du ja på den frågan. Sysprep kommer att förbereda maskinen så att du kan använda den för att skapa en image, som också är nästa steg.
På azure portalen använder du capture funktionen för denna VM:

capture

Du kommer nu att få en varning om att VM:en kommer tas bort, men det gör inget, skulle du behöva den igen kan du skapa en ny från imagen. När capturingen är klar återfinner du din image under “VM images (classic)”.
Nu är du redo att börja skapa din RemoteApp. Öppna nu “RemoteApp collections”, vilket kommer ta dig till gamla portalen. Här ska du nu skapa en template image så gå in på “TEMPLATE IMAGES”.

remoteapptemplate

Välj här att importerar en image, antingen via länken som visas vid tom lista eller använd “Add” knappen längst ner.
I dialogrutan som poppar upp använder du valet att importera en image från ditt Virtual Machines library och väljer i nästa steg den Imagen du skapade tidigare. Att skapa en template tar en liten stund men när den har statusen ready är vi redo att gå vidare.
Nu kan du skapa din remoteapp collection. Byt till det menyvalet och använd new knappen längst ner.

createnew

Även detta steg tar lite tid men när det är klart visas din collection i listan med status Active. Klicka då in dig på den. Under menyvalet Publishing kan du nu lägga till den eller de applikationer du tidigare installerade. Använd knappen Publish som du återfinner längst ner på sidan.

publishing

Om ditt program som installerades hamnade på start menyn kan du använda Publish Start menu programs annars använder du valet Publish programs using path.
Under menyvalet User Access lägger du nu till de användare som skall få komma åt och använda dina remote apps.
Användarna behöver nu laddar ner klienten och logga in med kontot som du la till under User Access.

tisdag 17 maj 2016

Exception från Parallel.ForEach

Parallel klassen ingår i det som kallas Task Parallel Library (TPL) och som Microsoft lanserade i .NET Framework 4. I denna ingår även Task klassen och Parallel LINQ (PLINQ) och även dessa berörs av det som beskrivs nedan.


I och med de nya parallella strukturerna i .NET 4 blev det enklare att hantera trådade applikationer. Något som dock fortfarande kan vara lite svårt är felhanteringen men även där har Microsoft tänkt till. Det största problemet för oss är att felet händer inte på huvudtråden utan på någon bakgrundstråd OCH det kan även ske flera fel.


Med ett anrop till Parallel.ForEach, Parallel.For men även Task.Wait och användning av PLINQ körs koden i en eller flera andra trådar, men din huvudtråd inväntar sedan att dessa är klara. Exception kommer därför att fångas på din huvudtråd men pg.a att tex kan hinna ske flera fel samlas alla ihop i en AggregateException. Därför skall du alltid fånga denna Exception och sedan titta på dess InnerExceptions för att få ut exakta felen.

 

try
{
Parallel.ForEach(myCollection, item => {...});
}
catch (AggregateException aEx)
{
foreach (var ie in aEx)
{
//ie is the exception thrown in the other thread
}
}
catch (Exception ex)
{
//default error handling
}

msdn: AggregateException Class

Set focus via XAML

Att få fokus på en grafisk kontroll görs genom att anropa Focus() funktionen på denna kontroll men att göra detta rimmar illa med MVVM mönstret speciellt om det är något från vymodellen som skall bestämma om det skall vara focus eller inte. Detta problem löser vi enklast med en så kallade extension, då kan även få till databinding.
En extension skrivs som en egen klass med set och get funktion för värdet samt en dependency property där vi fångar upp när värdet ändras och har då möjlighet att anropa Focus().
public static class FocusExtension
{
  public static bool GetFocused(DependencyObject o)
  {
 return (bool)o.GetValue(FocusedProperty);
  }

  public static void SetFocused(DependencyObject o,
 bool value)
  {
 o.SetValue(FocusedProperty, value);
  }

  public static readonly DependencyProperty FocusedProperty =
 DependencyProperty.RegisterAttached("Focused", 
 typeof(bool), typeof(FocusExtension),
 new UIPropertyMetadata(false, OnValueChanged));

  private static void OnValueChanged(DependencyObject d, 
 DependencyPropertyChangedEventArgs e)
  { 
   var uie = (UIElement) d;
   if ((bool)e.NewValue)
   {
    uie.Focus();
   }
  }
}
I denna extension finns det inget vi ska/kan göra vid ett falskt värde, det finns ingen UnFocused() funktion utan de grafiska elementen blir av med sin fokus genom att någon annan tar den.
För att sedan använda den på te.x. en TextBox med en binding till vymodellen (förutsätter att du har propertyn Focus i din VM och helst också med ett OnPropertyChange event i dess setter):
<TextBox uiEx:FocusExtension.Focused="{Binding Focused}"/>
Eller med ett direkt värde:
uiEx:FocusExtension.Focused="True"
Du kan också behöva inkludera namespacet om du inte redan har gjort det (eller fått hjälp av verktyg). Det ser ut såhär:
xmlns:uiEx="clr-namespace:CSharpSoftware.UIExtensions"
Om du har följande namespace runt din extension klass:
namespace CSharpSoftware.UIExtensions
{
 public static class FocusExtension
  {

onsdag 20 januari 2016

Framework 4, 4.5 och 4.5.1 inte längre supporterade

Sedan förra veckan supporterar Microsoft inte längre .NET framework 4, 4.5 samt 4.5.1. Därför gör du bäst i att uppgradera till 4.5.2.

Microsoft fortsätter dock att supportera 3.5 SP1 liksom nya 4.6 och 4.6.1

https://support.microsoft.com/sv-se/gp/framework_faq/en-us

torsdag 5 november 2015

Bra bibliotek för ikoner samt ett program för att anpassa dem

Jag har tidigare tipsat om de medföljande ikonerna till Visual Studio, tyvärr kan dessa ikoner ibland vara i fel storlek, fel färg eller liknande. Därför vill jag nu tipsa om ett riktigt bra bibliotek med ikoner som också har editeringsmöjligheter. Det innehåller i skrivande stund över 6000 ikonbilder och växer ständigt:
Syncfusions Metro Studio 4.

Sök för att snabbt hitta en ikon




Editera för önskad färg, storlek, bakgrund, m.m.


Exportera till önskat format


Det är helt gratis och får användas helt fritt. Har du några önskemål på nya ikoner kan du kontakta Syncfusion då de planerar att släppa flera ikoner till biblioteket.

Ladda hem Metro Studio 4

fredag 27 februari 2015

Developer Command Promt på Tools menyn

Varje gång jag använder Developer Command Promt så funderar jag över varför den inte finns att öppna inifrån Visual Studio på ett lätt sätt. Nu behöver jag inte fundera längre, nu har jag den på Tools meny.

ToolsMenu

Så här gör du

Öppna External Tools som du hittar på samma meny (Tools)


ExternalToolsDialog

Tryck på Add och fyll i följande:
     
Title: Command Prompt Detta är vad som kommer visas i Tools menyn
Command: C:\Windows\System32\cmd.exe  
Arguments: /k "C:\Program Files (x86)\Microsoft Visual Studio 12.0\Common7\Tools\vsvars32.bat" Kan behöva ändras beroende på vilken version av Visual Studio du har installerad.
Initial directory: c:\ Kan lämnas tomt men då hamnar du i samma mapp som angetts i arguments.

Avsluta sedan med OK och du kommer finna din commando promt länk på Tools meny.