Visualizzazione post con etichetta "silverlight". Mostra tutti i post
Visualizzazione post con etichetta "silverlight". Mostra tutti i post

domenica 8 settembre 2013

Implementare INotifyPropertyChanged

Di seguito viene illustrato come implementare l'interfaccia INotifyPropertyChanged per notificare che una proprietà è cambiata.
public class ViewModel : INotifyPropertyChanged
{
    public event PropertyChangedEventHandler PropertyChanged;
    protected void OnPropertyChanged(string propertyName)
    {
        PropertyChangedEventHandler handler = PropertyChanged;
 
        if (handler != null)
        {
            handler(thisnew PropertyChangedEventArgs(propertyName));
        }
    }
 
    private string miaProprieta;
    public string MiaProprieta
    {
        get { return miaProprieta; }
        set 
        {
            if (miaProprieta != value)
            {
                miaProprieta = value;
                OnPropertyChanged("MiaProprieta");
            }
        }
    }
}

sabato 27 luglio 2013

[WPF-SL-Win8] Modern UI (Metro) Charts per Windows 8, WPF, Silverlight

Progetto open source che ci pemette di creare dei grafici in stile metro nella applicazione per Windows 8, WPF e Silverlight.

Grafici disponibili

  • ColumnChart (ClusteredColumnChart, StackedColumnChart, StackedColumnChart100Percent)
  • PieChart (PieChart and Dognut)
  • BarChart (ClusteredBarChart, StackedBarChart, StackedBarChart100Percent)
  • Doughnut Chart
  • Radial Gauge Chart
E' possibile visualizzare un esempio in Silverlight al seguente link

Sito ufficiale

mercoledì 10 luglio 2013

[Silverlight + WCF] Chiamata Cross Domain

Non è consentito effettuare da Silverlight (per questioni di sicurezza) chiamate remote cross dominio, a meno che il servizio non espone il file clientaccesspolicy.xaml.
Per ovviare a ciò non ci resta che creare il file clientaccesspolicy.xml nella root progetto WCF:

<?xml version="1.0" encoding="utf-8"?>
<access-policy>
  <cross-domain-access>
    <policy>
      <allow-from http-request-headers="SOAPAction">
        <domain uri="*"/>
      </allow-from>
      <grant-to>
        <resource path="/" include-subpaths="true"/>
      </grant-to>
    </policy>
  </cross-domain-access>
</access-policy> 
Errore visualizzato:

Errore durante il tentativo di effettuare una richiesta all'URI xxxx. Ciò può essere dovuto al tentativo di accesso a un servizio in modalità di interdominio senza disporre di criteri di interdominio appropriati o con criteri non adatti ai servizi SOAP. Potrebbe essere necessario contattare il proprietario del servizio per pubblicare un file di criteri di interdominio e verificare che consenta l'invio di intestazioni HTTP correlate a SOAP. Questo errore potrebbe essere anche dovuto all'utilizzo di tipi interni nel proxy del servizio web senza utilizzare l'attributo InternalsVisibleToAttribute. Per ulteriori informazioni, vedere l'eccezione interna.

giovedì 4 luglio 2013

[WPF - SL] Interfaccia multi-finestre con FloatingWindow

FloatingWindow è un'insieme di librerie che permette di creare delle interfacce multi-finestre (multi-windows interface).


E' disponibile sia per WPF che per Silverlight.

  • Struttura

Gli elementi principali presenti nel progetto sono:
  1. FloatingWindow: Classe di base della finestra ridimensionabile (resizable windows)
  2. FloatingWindowHost: Elemento canvas che contiene le varie FloatinWindo
  3. Iconbar: Pannelo contenente le icone della finestra
  4. Bootstrap Button: pulsante di apertura/chiusura dell'IconBar
  5. Bottom Bar: controllo che può hostare altri tipi di controlli
  •  Utilizzo

L'utilizzo è estremamente semplice. Basta creare il "contenitore" di tipo FloatingWindowHost e inserire le varie FloatingWindow.

Creazione FloatingWindowHost da XAML
<my:FloatingWindowHost x:Name="host"
    SnapinEnabled="True" ShowMinimizedOnlyInIconbar="False">
</my:FloatingWindowHost>


Creazione FloatingWindow da C#
FloatingWindow window = new FloatingWindow();
window.Title = "New window";
host.Add(window);
window.Show();


Creazione FloatingWindow da XAML
<my:FloatingWindow x:Class="FloatingWindowControl.DetailsForm"
    xmlns:my="clr-namespace:SilverFlow.Controls;assembly=SilverFlow.Controls"
    Height="Auto" MinWidth="100" MinHeight="100"
    Title="Details" IconText="Details Form" Tag="Details">

martedì 18 giugno 2013

[SL4] Forzare il re-binding di un controllo

public static void ForceControlRebind(Control cntrl, DependencyProperty depprop)
{
    try
    {
        BindingExpression BindExp = cntrl.GetBindingExpression(depprop);
        Binding Bind = BindExp.ParentBinding;
        cntrl.SetBinding(depprop, Bind);
    }
    catch { }
}

[WPF/SL/WP] Clonare ObservableCollection

Metodo esteso che consente di clonare una generica ObservableCollection.
public static ObservableCollection<T> Clone<T> (this ObservableCollection<T> source)
{
    if (source != null)
    {
        var res = new ObservableCollection<T>();
 
        foreach (var item in source)
        {
            res.Add(Clone<T>(item));
        }
        return res;
    }
    return null;
}

[SL4] Settare pulsante di defualt

public class DefaultButton
{
    public static DependencyProperty DefaultButtonProperty = DependencyProperty.RegisterAttached("DefaultButton",
                                                                typeof(Button),
                                                                typeof(DefaultButton),
                                                                new PropertyMetadata(null, DefaultButtonChanged));
 
    private static void DefaultButtonChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
    {
        var uiElement = d as UIElement;
        var button = e.NewValue as Button;
        if (uiElement != null && button != null)
        {
            uiElement.KeyUp += (sender, arg) =>
            {
                var peer = new ButtonAutomationPeer(button);
 
                if (arg.Key == Key.Enter)
                {
                    peer.SetFocus();
                    uiElement.Dispatcher.BeginInvoke((Action)delegate
                    {
                        var invokeProv = peer.GetPattern(PatternInterface.Invoke) as IInvokeProvider;
                        if (invokeProv != null)
                        {
                            if (button.IsEnabled)
                            {
                                invokeProv.Invoke();
                            }
                        }
                    });
                }
            };
        }
    }
 
    public static Button GetDefaultButton(UIElement obj)
    {
        return (Button)obj.GetValue(DefaultButtonProperty);
    }
 
    public static void SetDefaultButton(DependencyObject obj, Button button)
    {
        obj.SetValue(DefaultButtonProperty, button);
    }
}

XAML
<TextBox utility:DefaultButton.DefaultButton="{Binding ElementName=nomeBottone}"/>