Visar inlägg med etikett WPF. Visa alla inlägg
Visar inlägg med etikett WPF. Visa alla inlägg

torsdag, oktober 15, 2009

Multi touch i VS2010

Touch och multi touch är något som har legat mig varmt om hjärtat senaste året. Det hela började med att vi på Connecta köpte ett Microsoft Surface-bord för snart ett år sedan. Redan då pratade Microsoft om vikten av att börja jobba med och lära sig multi touch och nu ser vi Windows 7 och WPF 4.0 komma med inbyggt stöd för multi touch.

I WPF 4.0 har man lagt till ett antal event till UIElement som rör muti touch. De berörda .NET API:er är baserar på native Win32 API som bara är tillgängliga i Windows 7. UIElement är den basklass som definierar kärnan för visuella kontroller för layout, input och events. De event som finns idag (beta 1 av VS2010) är: ManipulationStarted Event, ManipulationCompleted Event, ManipulationDelta Event, ManipulationInertiaStarting Event och ManipulationBoundaryFeedback Event. Som standard får ett UIElement aldrig händelser rörande Manipulation om inte ManipulationMode är satt till ett annat värde än None. Med hjälp av ManipulationMode kan man styra vilken typ av manipuleringar man ska kunna göra på ett objekt. Det kan t ex vara translatera på X och/eller Y-axeln, rotera, eller skala.

I beta 1 av .NET Framework 4.0 finns eventen för manipulering med men det finns inte några WPF-kontroller som använder sig av dem. I kommande versioner kommer det att man enkelt bara slå på touch-kontroller på t ex sliders eller scrollviewers direkt i XAML.

När man fångar ManipulationDelta på ett Window får man ManipulationDeltaEventArgs. Den kan man sedan använda för att ta reda på vilken förändring som har inträffat. Med metoden GetDeltaManipulation får man ut en System.Windows.Input.Manipulation som innehåller all transformationsdata som fanns när eventet inträffade. Den informationen kan man sedan använda för att utföra translateringar på objektet. Lite komplext men ett kodexempel gör det nog enklare att förstå!

Observera att ManipulationDelta aldrig kommer att exekveras med en vanlig mus utan det måste vara något slags touch device. Med hjälp av ett projekt på CodePlex som heter Multi-Touch Vista kan man simulera användandet av flera touchpunkter med vanlig mus eller touch pad.

I xaml-filen lägger jag till en bild i en canvas. Till den kopplar jag en MatrixTransform så att jag sedan kan komma åt den från kod. Jag lägger också till en event handler för ManipulationDelta.

<Window   x:Class="WpfApplication13.Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="Window1" Height="300" Width="300"
WindowState="Maximized" ManipulationDelta="Window_ManipulationDelta">
<Window.Resources>
<MatrixTransform x:Key="InitialMatrixTransform">
<MatrixTransform.Matrix>
<Matrix OffsetX="200" OffsetY="200"></Matrix>
</MatrixTransform.Matrix>
</MatrixTransform>
</Window.Resources>
<Canvas>
<Image Width="100" Source="/WpfApplication13;component/Images/Sonicspree.jpg" ManipulationMode="All" RenderTransform="{StaticResource InitialMatrixTransform}" ></Image>
</Canvas>
</Window>

I code behind använder jag ManipulationDelta för att flytta bilden baserat på input:

private void Window_ManipulationDelta(object sender, ManipulationDeltaEventArgs e)
{
var delta = e.GetDeltaManipulation(this);
var image = e.OriginalSource as Image;
var matrix = ((MatrixTransform)image.RenderTransform).Matrix;
var originalCenter = new Point(image.ActualWidth / 2, image.ActualHeight / 2);

//Translate on the x and y-axis
matrix.Translate(delta.Translation.X, delta.Translation.Y);

//Get the new center point and rotate around that based on the delta
var center = matrix.Transform(originalCenter);
matrix.RotateAt(delta.Rotation, center.X, center.Y);
center = matrix.Transform(originalCenter);

//Scale the matrix based on the delta
matrix.ScaleAt(delta.Scale, delta.Scale, center.X, center.Y);

//Apply the new MatrixTransform
image.RenderTransform = new MatrixTransform(matrix);

e.Handled = true;

}
 

Notera de två röda prickarna som symboliserar de två möss jag har koppad till den här datorn. Koden i exemplet är baserat på en video på You Tube som också visar applikationen in action.

MultiTouchVS2010 
 

måndag, mars 16, 2009

Dags för TechDays!

Imorgon är det dags för Microsofts konferens TechDays i Västerås. Jag och Pelle Johansson kommer att köra en session imorgon som heter ”Rundra gränssnitt i en fyrkantig värld” som handlar om hur man kan använda WPF när man bygger addins till Office. Ikväll var vi på tech-check i hörsalen som vi blivit tilldelade. Inget var klart men det är några sessioner innan oss imorgon så det löser sig nog. Hörsalen för övrigt den näst största salen på konferensen och jag tror att den tar ca 150 personer. Vi har hård konkurrens av andra intressanta sessioner som behandlar nyheterna i VS2010 Team System med Magnus Juvas, Modelling in Oslo med Johan Lindfors och Alan Smith, ASP.NET 4.0 med Scott Galloway från ASP.NET teamet i Redmond plus några till. Men med 1300 deltagare så finns det några att dela på.


Just nu sitter vi på Pelles hotellrum i Västerås och slipar på presentationen. Ska bli skönt att köra under första dagen så att man får möjlighet att ta det lugnt och skönt imorgonkväll!

lördag, november 29, 2008

Rendering i WPF

När det gäller rendering av grafik i WPF pratar man om att den sker i olika lager, eller tiers. Ett tier definieras av vilka möjligheter och vilken prestanda grafikhårdvaran har på den dator som kör applikationen och desto högre tier man kör på desto bättre prestanda får man. WPF har tre olika Tiers.

Tier 0: På tier 0 har man ingen hårdvaruacceleration utan all rendering utförs av mjukvaran och exekveras på datorns CPU. Man hamnar på tier 0 om man har en DirectX-version lägre än 7.0.

Tier 1: På tier 1 har man delvis tillgång till hårdvaruacceleration. Minnet på grafikkortet måste vara +30MB och versionen av DirectX är större än 7.0 och mindre än 9.0.

Tier 2: Här har man hårdvaruacceleration på alla element som har stöd för hårdvarurendering. T ex så dök det upp stöd för hårdvarurendering av bitmap effects som Blur och DropShadow. För att komma upp i tier 2 måste man ha DirectX-version som är högre än 9.0, minst 120MB grafikminne samt lite andra grejer.

DirectX

Den senaste version av DirectX för XP är nio och Microsoft har sagt att de bara kommer att släppa DirectX 10 för Vista (och senare). Det finns en version av DirectX 10 för XP men den är inte från Microsoft. Vilken version som körs av DirectX får man enklast fram genom att köra dxdiag från en commandopromt.

RenderCapability

För att ta reda på vilket tier man exekverar på kan man använda sig av RenderCapability.Tier. Den returnerar en Int32 som man får göra en right-shift-operation på för att få reda på vilket tier den motsvarar.

RenderCapability.Tier returnerar följande för respektive lager:

Tier 0: 0

Tier 1: 65536

Tier 2: 131072

och koden för att göra en right-shift är:

var tier = (RenderCapability.Tier >> 16).ToString();


Microsoft har en bra beskrivning av vad som skiljer de olika lagren på http://msdn.microsoft.com/en-us/library/ms742196.aspx