Alessandro Del Sole's Blog

/* A programming space about Microsoft® .NET® */

  Home :: Contact :: Syndication  :: Login
  1204 Posts :: 64 Stories :: 1555 Comments :: 251 Trackbacks

News

Your host

This is me! Questo spazio è dedicato a Microsoft® .NET®, di cui sono molto appassionato :-)

These postings are provided 'AS IS' for entertainment purposes only with absolutely no warranty expressed or implied and confer no rights.
If you're not an Italian user, please visit my English blog

Microsoft MVP

My MVP Profile

My MVP Corner Page

Il mio libro su VB2010!

Il mio nuovo libro su Visual Basic 2010 E' uscito il mio libro "Visual Basic 2010 Unleashed". Clicca sulla copertina per informazioni!

Visual Basic Tips & Tricks Team Member

Le vostre visite

I'm a VB!

Guarda la mia intervista a Seattle

Windows Live Alerts

Vsi Builder 2008

Il mio tool per VS 2005/2008 Scarica Vsi Builder, il mio tool per Visual Studio 2005/2008!

Aggiungimi al Social MSDN!

Dove vivo

Contattami su Messenger


Grab this badge here!

Guarda i miei webcast MSDN

CyberInstaller Beta Tester

Scarica il nuovo CIS 2009!!

Altri spazi

CodePlex download Scarica i miei progetti open-source su CodePlex!

Cerca nel blog



Seguimi su Twitter!

Article Categories

Archives

Post Categories

Image Galleries

.NET Framework

Back to basics

Blogroll

Help 1.x e 2.0

Microsoft & MSDN

Setup & Deployment

Visual Basic .NET e 2005

Come probabilmente sapete, nelle soluzioni create coi Visual Studio Tools for Office è possibile utilizzare controlli utente WPF ricorrendo all'interoperabilità con Windows Forms, ospitando i controlli WPF all'interno di ElementHost e di questo impostare la proprietà Child che punta al controllo WPF desiderato. Ne parlammo un po' di tempo fa in questo vecchio post.

 

Ovviamente non siamo limitati all'aggiunta dei soli controlli esposti dalla libreria di classi base. Infatti è possibile aggiungere alle soluzioni VSTO anche controlli utente WPF personalizzati ed è ciò che vedremo in questo post. Possiamo, per esempio, creare una soluzione per la realizzazione di un add-in per Microsoft Excel 2007 in Visual Studio 2008 (File|New|Project|Visual Basic|Office 2007).

 

Il primo passaggio è costituito dalla creazione del controllo WPF. Selezioniamo il comando Project|Add new item e selezioniamo poi il template WPF User Control, come mostrato in figura:

 

 

Il nostro controllo si chiamerà CompositeUserControl.xaml. Questa è solo una dimostrazione didattica, di conseguenza non ci soffermeremo sulla creazione di un controllo utente complesso, ma piuttosto su qualcosa di semplice che ci sia utile per capire. Abbiamo una semplice griglia, suddivisa in due righe:

 

    <Grid>

        <Grid.RowDefinitions>

            <RowDefinition/>

            <RowDefinition Height="50"/>

        </Grid.RowDefinitions>

 

Poi potremmo prevedere un messaggio di testo e un pulsante:

 

        <TextBlock Grid.Row="0" Text="Write something here"

                   FontWeight="Bold" FontSize="14" Name="Text1">

            <TextBlock.Foreground>

                <SolidColorBrush Color="Black" x:Name="TextBrush1"/>

            </TextBlock.Foreground>

        </TextBlock>

 

        <Button Grid.Row="1" Width="100" Height="40" Name="Button1">Click me!</Button>

    </Grid>

 

Abbiamo specificato un elemento SolidColorBrush per il TextBlock perchè vogliamo rendere più simpatica l'interfaccia utilizzando una ColorAnimation da applicare al TextBlock e questa richiede un oggetto Brush come destinazione. Ipotizzando di voler avviare l'animazione al caricamento della griglia, possiamo gestire i Grid.Triggers come segue:

 

        <Grid.Triggers>

            <EventTrigger RoutedEvent="Grid.Loaded">

               

            <BeginStoryboard>

                <Storyboard>

                    <ColorAnimation From="Black" To="Red"

                                    AutoReverse="True" RepeatBehavior="Forever"

                                    Duration="0:0:3"

                                    Storyboard.TargetProperty="Color"

                                    Storyboard.TargetName="TextBrush1">

                    </ColorAnimation>

                </Storyboard>

            </BeginStoryboard>

            </EventTrigger>

        </Grid.Triggers>

 

A questo punto possiamo fare doppio clic sul pulsante nel designer affinché Visual Studio 2008 generi per noi un gestore di evento Click, che potremmo implementare come segue:

 

    Private Sub Button1_Click(ByVal sender As System.Object, _

                              ByVal e As System.Windows.RoutedEventArgs) Handles Button1.Click

        System.Windows.MessageBox.Show("You clicked!")

    End Sub

 

Come abbiamo detto in precedenza, si tratta di un qualcosa di semplice per capire come funzionino le cose. Compiliamo la soluzione affinché il nuovo controllo WPF sia disponibile nella toolbox e riconosciuto dall'IDE.

 

Ora aggiungiamo al progetto un nuovo controllo utente di tipo Windows Forms; questo passaggio è necessario per poter ospitare e utilizzare il nostro controllo WPF. Selezioniamo il comando Project|Add user control quindi il template User Control come riportato in figura:

 

 

 

Il controllo si chiamerà HostUserControl.vb. Nella casella degli strumenti, espandiamo la scheda chiamata WPF Interoperability (relativa all'interoperabilità tra Win Forms e WPF) e facciamo doppio clic sul controllo ElementHost, che verrà così aggiunto sulla superficie del nostro controllo utente. Questa operazione aggiungerà, inoltre, tutti i riferimenti necessari agli assembly principali di WPF, come WindowsBase.dll, PresentationCore.dll e PresentationFramework.dll. Facciamo clic sulla freccetta denominata ElementHost Tasks e selezioniamo il controllo WPF che dev'essere ospitato dalla finestra di popup illustrata in figura:

 

 

 

 

Come si può osservare dal designer, il nostro controllo Windows Forms ora ospita un controllo WPF personalizzato e funzionante a tutti gli effetti:

 

 

 

Per dimostrare come possiamo interagire con i vari elementi del controllo WPF, passiamo all'editor di codice Visual Basic per il file HostUserControl.vb e digitiamo quanto segue:

 

    Public Sub New()

 

        InitializeComponent()

 

        'Posso interagire con gli elementi del mio controllo utente

        'purchè abbiano impostata la proprietà Name

        Me.CompositeUserControl1.Text1.Text = "WPF & VSTO Demo"

    End Sub

 

Abbiamo semplicemente cambiato a run-time una proprietà di uno dei controlli che costituiscono l'interfaccia del controllo WPF. Ora ipotizziamo di voler crerare un riquadro delle attività personalizzato per Microsoft Excel 2007 che conterrà il nostro user control. Per informazioni su come creare riquadri attività personalizzati per le applicazioni di Microsoft Office System nelle soluzioni VSTO, potete consultare questo mio articolo sul Visual Basic Developer Center. Facciamo doppio clic sul file ThisAddin.vb e digitiamo il seguente codice:

 

Imports Microsoft.Office.Tools

 

 

    Private WpfTaskPane As CustomTaskPane

 

    Private Sub ThisAddIn_Startup(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Startup

 

        Me.WpfTaskPane = Me.CustomTaskPanes.Add(New HostUserControl, "WPF Composite Control")

        Me.WpfTaskPane.Visible = True

 

    End Sub

 

Se ora proviamo ad avviare il componente aggiuntivo, dovremmo ottenere un risultato simile alla figura:

 

 

 

Se tutto è andato a buon fine, il colore di primo piano del messaggio di testo cambierà a intermittenza passando dal nero al rosso in autoreverse J

 

Quindi è abbastanza evidente che integrare controlli WPF personalizzati nelle soluzioni VSTO sia piuttosto semplice, potendo così estendere quanto già sapevamo relativamente all'uso dei controlli WPF standard.

 

Alessandro

posted on Monday, January 12, 2009 6:57 PM

Feedback

# Nasce Wpfitalia.it, dedicato alle nuove 12/14/2009 11:44 AM Il blog di Gianni Giaccaglini


# Nasce Wpfitalia, dedicato alla nuova tecnologia WPF 12/14/2009 12:36 PM Il blog di Gianni Giaccaglini


Post Feedback

Title:
Name:
Url:
Comments: 
Codice di sicurezza
Protected by FormShield