Overblog Suivre ce blog
Administration Créer mon blog

Présentation

  • : Romagny13 - Du .NET,du pur .NET
  • Romagny13 - Du .NET,du pur .NET
  • : Cycle de progression Faire (quelque chose qui marche) -> comprendre ce que l’on fait/comment cela marche -> pousser plus loin les notions
  • Contact

Recherche

Articles Récents

2 mai 2014 5 02 /05 /mai /2014 23:38

1-Présentation

  • « Fast and fluid » .Les  applications Windows Store doivent se concentrer sur le contenu, proposer une bonne expérience utilisateur(UX) et ne jamais être bloquées .

  • Snapping : on peut afficher  2 applications dans un écran partagé.L’une étant « Filled » et l’autre « Snapped »

  • Charms : (menu) supportent l’intégration avec Windows

  • App bar : barre pour les actions spécifiques de l’application

win81 

http://msdn.microsoft.com/fr-fr/windows/apps/br229512.aspx

Référence http://msdn.microsoft.com/fr-fr/library/windows/apps/br211377.aspx

Projets Windows Store : HTML/JavaScript/CSS ou XAML/C# C++ VB

Types de Projets Windows Store

  • Vide (Blank)

  • Grid si on a beaucoup de collections à afficher        

  • Split pour un scénario de vue Maitre détail

  • Visual Studio 2013 RC2 en ajoute des nouveaux dont les applications universelles qui devraient permettre de cibler avec une seule application Windows Phone et WinRT     

3 états d’application:

  • En cours (Running)

  • Suspendue (Suspended)

  • Finie (Terminated) .Par exemple l’application peut être fermée si windows a besoin de ressources .C’est pour cela qu’il faut veiller à sauvegarder l’état de son application au passage à l’état « suspendu »(on a 5 secondes maximum pour cela)

Controls  En plus des classiques boutons, checkbox, listView, listBox …

 win82.png

Appxmanifest : informations sur l’application, ses capacités, etc.     

win83

2- Hello World

Hello World HTML/JS 

http://msdn.microsoft.com/fr-fr/library/windows/apps/hh465493.aspx

Avec un projet vide Windows Store HTML/JS.On a :

  • La page html default.html

  • Le fichier JavaScript default.js

  • La feuille de style default.css

Dans la page html

<body>

    <label for="tbMessage">Message : </label>

    <input id="tbMessage" type="text" /><br/>

    <input id="btSubmit" type="button" value="submit" /><br />

    <span id="lbResult" />

</body>

 

Dans le fichier javascript

app.onloaded = function () {

 

        var bt = document.getElementById("btSubmit");

        bt.addEventListener("click", function () {

            var tb = document.getElementById("tbMessage");

            var lb = document.getElementById("lbResult");

            lb.innerHTML = tb.value;

        });

 

    }

Et dans la feuille de style

#lbResult {

   color:brown;

}

 

Hello World Xaml/C#

Avec un projet vide Windows Store Xaml/C# ,on a :

  • Mainpage.xaml

  • App.xaml

Mainpage

<Grid Background="{ThemeResource ApplicationPageBackgroundThemeBrush}">

        <Grid.RowDefinitions>

            <RowDefinition Height="40"/>

            <RowDefinition Height="40"/>

            <RowDefinition Height="40"/>

            <RowDefinition Height="*"/>

        </Grid.RowDefinitions>

        <Grid.ColumnDefinitions>

            <ColumnDefinition Width="1*"/>

            <ColumnDefinition Width="3*"/>

        </Grid.ColumnDefinitions>

        <TextBlock Grid.Column="0" Grid.Row="0"  HorizontalAlignment="Left" Margin="10" Text="Message :"/>

        <TextBox Name="tb" Grid.Column="1" Grid.Row="0" HorizontalAlignment="Left" Margin="10" />

        <Button Name="bt"  Grid.Column="1" Grid.Row="1" Content="OK" Click="bt_Click" />

        <TextBlock Name="lb" Grid.Column="1" Grid.Row="2" Style="{StaticResource resultStyle}" />

    </Grid>

Code behind

  public sealed partial class MainPage : Page

    {

        public MainPage()

        {

            this.InitializeComponent();

        }

 

        private void bt_Click(object sender, RoutedEventArgs e)

        {

            lb.Text = tb.Text;

        }

    }

Et on ajoute un style dans App.xaml (ou dans un dictionnaire de ressources, etc.)

<Application.Resources>

        <Style x:Key="resultStyle" TargetType="TextBlock">

            <Setter Property="Foreground" Value="Brown" />

        </Style>

</Application.Resources>

 

win84

 

WinJS

UI Surfaces

  • App bar

  • Message dialogs (ruban qui traverse la page ,exemple lorsqu’on clique sur un lien PDF)

  • Context menu

  • Flyout

  • Etc .

http://msdn.microsoft.com/en-us/library/windows/apps/br229782.aspx

Navigation

  • PageControlNavigator

  • Page Control (création fichiers *.js,*.css,*.html )

http://msdn.microsoft.com/fr-fr/library/windows/apps/hh452761.aspx

Controls

  • Utilise les controls HTML Standards

http://msdn.microsoft.com/fr-fr/library/windows/apps/hh465451.aspx        

http://www.w3schools.com/html/html_forms.asp

http://www.w3schools.com/html/html5_new_elements.asp

 

+data-win-control attribut pour <div> (exemple DatePicker)    

+ data-win-options    

Databind

Animation

http://msdn.microsoft.com/fr-fr/library/windows/apps/xaml/hh452701.aspx

Tile(tuile)

http://msdn.microsoft.com/fr-fr/library/windows/apps/hh761491.aspx

 

Repost 0
Published by Romagny13 - dans WinRT
commenter cet article
1 mai 2014 4 01 /05 /mai /2014 23:49

bootswatch.png

http://bootswatch.com/

Il suffit de télécharger la version compressée du fichier et l’ajouter à son site.

On peut le renommer (exemple je télécharge le thème Slate et je le renomme en « bootstrap-slate-theme.min.css »)

<meta name="viewport" content="width=device-width, initial-scale=1.0" />

<link href="Content/bootstrap.min.css" rel="stylesheet" />

<link href="Content/bootstrap-slate-theme.min.css" rel="stylesheet" />

<%-- <link href="Content/bootstrap-theme.min.css" rel="stylesheet" />--%>

<script src="Scripts/jquery-1.9.0.min.js"></script>

<script src="Scripts/bootstrap.min.js"></script>

 

 

 

Repost 0
26 avril 2014 6 26 /04 /avril /2014 22:54

Visual Studio 2013 ne prend en charge MVC qu’à partir de la version 4 . 

http://msdn.microsoft.com/fr-fr/library/hh266747.aspx

 

  Upgrade de MVC2 vers MVC3 (ASP.NET MVC 3 Application Upgrader)

http://aspnet.codeplex.com/releases/view/59008

mvc2tomvc3.png

 

   Upgrade de MVC3 vers MVC4

Depuis Visual Studio 2013 .

Ouvrir la solution dont le projet MVC ne peut être chargé

… puis chercher « Auto upgrade mvc 3 to mvc4 » (ou simplement « upgrade mvc3 ») avec le gestionnaire de package NuGet

mvc2tomvc4.png

Il se peut qu’il faille ajouter une référence à « Microsoft.AspNet.Web.Optimization » depuis le gestionnaire de package NuGet ensuite .Cibler le Framework 4.0 peut aussi éviter des problèmes de versions de fichiers . 

 

 

 

Repost 0
Published by Romagny13 - dans ASP.NET MVC
commenter cet article
24 avril 2014 4 24 /04 /avril /2014 17:20

Bootstrap(documentation en français)

http://www.oneskyapp.com/docs/bootstrap/fr      

1-Utilisation de Glyphicons

Icones disponibles http://getbootstrap.com/components/

2 possibilités : soit utiliser un CDN, soit télécharger les fichiers

Exemple

boo1.png

<!doctype html>

<html>

<head>

    <meta charset="utf-8">

    <title></title>

 

    <!--CDN-->

    <link rel="stylesheet" href="http://netdna.bootstrapcdn.com/bootstrap/3.1.1/css/bootstrap.min.css">

    <link rel="stylesheet" href="http://netdna.bootstrapcdn.com/bootstrap/3.1.1/css/bootstrap-theme.min.css">

    <!--Local-->

    <!--<link rel="stylesheet" type="text/css" href="css/bootstrap-theme.min.css">-->

    <!--<link rel="stylesheet" type="text/css" href="css/bootstrap.min.css">

    -->

</head>

<body>

<p><span class="glyphicon glyphicon-hand-right"></span> Icônes</p>

<p><span class="glyphicon glyphicon-home"></span> Accueil</p>

<p>

    <span class="label label-primary">

        <span class="glyphicon

glyphicon-comment"></span> 10 Commentaires

    </span>

    <button class="btn btn-warning">

        <span class="glyphicon

glyphicon-shopping-cart"></span>Ajouter au panier

    </button>

</p>

 

<!--CDN-->

<script src="http//netdna.bootstrapcdn.com/bootstrap/3.1.1/js/bootstrap.min.js"></script>

<!--Local-->

<!--<script src="js/bootstrap.min.js"></script>-->

</body>

</html>


2-Utilisation de Font Awesome

Icones disponibles http://fortawesome.github.io/Font-Awesome/icons/

Exemples http://fortawesome.github.io/Font-Awesome/examples/    

1 – Télécharger http://fortawesome.github.io/Font-Awesome/

2- Ajouter les dossiers « css » et « fonts » au site .

3- Page de base

<!DOCTYPE html>

<html lang="fr">

<head>

    <meta charset="utf-8">

    <title></title>

 

    <meta name="viewport" content="width=device-width, initial-scale=1.0">

    <link rel="stylesheet" href="http://netdna.bootstrapcdn.com/bootstrap/3.0.0/css/bootstrap.min.css">

    <link href="css/bootstrap.css" rel="stylesheet">

    <link href="css/font-awesome.min.css" rel="stylesheet">

    <!--[if IE 7]>

    <link rel="stylesheet" href="css/font-awesome-ie7.min.css">

    <![endif]-->

 

</head>

<body>

  

    <script src="js/jquery.js"></script>

    <script src="js/bootstrap.min.js"></script>

</body>

</html>

 

4- Exemple 

boo2.png

<!DOCTYPE html>

<html lang="fr">

<head>

    <meta charset="utf-8">

    <title></title>

 

    <meta name="viewport" content="width=device-width, initial-scale=1.0">

    <link rel="stylesheet" href="http://netdna.bootstrapcdn.com/bootstrap/3.0.0/css/bootstrap.min.css">

    <link href="css/bootstrap.css" rel="stylesheet">

    <link href="css/font-awesome.min.css" rel="stylesheet">

    <!--[if IE 7]>

    <link rel="stylesheet" href="css/font-awesome-ie7.min.css">

    <![endif]-->

</head>

<body>

    <i class="fa fa-spinner fa-spin"></i>

    <i class="fa fa-refresh fa-spin"></i>

    <i class="fa fa-cog fa-spin"></i>

    <i class="fa fa-dollar">29.99</i>

    <i class="fa fa-facebook-square"></i>

    <i class="fa fa-google-plus-square"></i>

    <i class="fa fa-linkedin-square"></i>

 

    <div class="input-group margin-bottom-sm">

        <span class="input-group-addon"><i class="fa fa-envelope-o fa-fw"></i></span>

        <input class="form-control" type="text" placeholder="Email address">

    </div>

    <div class="input-group">

        <span class="input-group-addon"><i class="fa fa-key fa-fw"></i></span>

        <input class="form-control" type="password" placeholder="Password">

    </div>

 

    <div class="btn-group open">

        <a class="btn btn-primary" href="#"><i class="fa fa-user fa-fw"></i> User</a>

        <a class="btn btn-primary dropdown-toggle" data-toggle="dropdown" href="#">

            <span class="fa fa-caret-down"></span>

        </a>

        <ul class="dropdown-menu">

            <li><a href="#"><i class="fa fa-pencil fa-fw"></i> Edit</a></li>

            <li><a href="#"><i class="fa fa-trash-o fa-fw"></i> Delete</a></li>

            <li><a href="#"><i class="fa fa-ban fa-fw"></i> Ban</a></li>

            <li class="divider"></li>

            <li><a href="#"><i class="i"></i> Make admin</a></li>

        </ul>

    </div>

 

    <script src="js/jquery.js"></script>

    <script src="js/bootstrap.min.js"></script>

</body>

</html>

Repost 0
16 avril 2014 3 16 /04 /avril /2014 15:07

 

AutoMapper est une librairie permettant de gérer facilement le Mapping et ainsi s'astreindre d'une tâche pas forcément passionnante (écrire une à une ses classes de Mapping)   

  • Chercher « AutoMapper » depuis le Gestionnaire de package NuGet

  • Ou taper dans la console du gestionnaire de package

    PM> Install-Package AutoMapper

     

     

Exemple :

On a

  • une classe Client (concrètement cela pourrait être une classe générée avec EDM ou Linq To SQL) « la source »

  • une classe ClientModel qui sera « la destination »

  • Un service qui permet de récupérer une IList<Client>  et doit renvoyer une IList<ClientModel>

  public class Client

    {

        public int Id { get; set; }

        public string Name { get; set; }

        public string Email { get; set; }

    }

    public class ClientModel

    {

        public int ClientID { get; set; }

        public string ClientFullName { get; set; }

        public string Email { get; set; }

    }

 

 

On définit d’abord le mappage pour la source et la destination

Mapper.CreateMap<Client, ClientModel>()

                .ForMember(c => c.ClientID, options => options.MapFrom(source => source.Id))

                .ForMember(c => c.ClientFullName, options => options.MapFrom(source => source.Name))

                .ForMember(c => c.Email, options => options.MapFrom(source => source.Email));

     

Puis

            foreach (Client clientSource in clients)

            {

                ClientModel clientDestination = Mapper.Map<ClientModel>(clientSource);

                result.Add(clientDestination);

            }

Plusieurs écritures possibles .Il est possible de définir le nom de chaque propriété soit en chaine de caractères, ou avec une expression(mieux car cela permet d’éviter les erreurs de syntaxe)

                ClientModel clientDestination = Mapper.Map<ClientModel>(clientSource);

                result.Add(clientDestination);

 

Ou

                ClientModel clientDestination = new ClientModel();

                result.Add(Mapper.Map(clientSource, clientDestination));

Il serait bien sûr possible de mettre en forme la valeur avec string.Format

On peut imaginer d’autres utilisations .Par exemple le mapping entre un « Model » et un « ViewModel »

 

Le service

    public interface IClientService

    {

        IList<ClientModel> GetAll();

    }

    public class ClientService : IClientService

    {

        private IList<Client> clients = new List<Client>(){

                        new Client(){Id=1,Name="Bellin, Marie",Email="bellinmarie@live.com"},

                        new Client(){Id=2,Name="Adams, Terry",Email="adamsterry123@live.com"},

        };

 

        public IList<ClientModel> GetAll()

        {

            IList<ClientModel> result= new List<ClientModel>();

 

            Mapper.CreateMap<Client, ClientModel>()

                .ForMember(c => c.ClientID, options => options.MapFrom(source => source.Id))

                .ForMember(c => c.ClientFullName, options => options.MapFrom(source => source.Name))

                .ForMember(c => c.Email, options => options.MapFrom(source => source.Email));

 

            // la liste de clients pourrait être récupérée avec EDM ou Linq To SQL

            foreach (Client clientSource in clients)

            {

                //ClientModel clientDestination = new ClientModel();

                //result.Add(Mapper.Map(clientSource, clientDestination));

                // ou

                ClientModel clientDestination = Mapper.Map<ClientModel>(clientSource);

                result.Add(clientDestination);

            }

 

            return result;

        }

    }

 

https://github.com/AutoMapper/AutoMapper

Repost 0
Published by Romagny13 - dans C
commenter cet article
14 avril 2014 1 14 /04 /avril /2014 01:41
On parle d’Asynchrone partout, surtout avec  WinRT.On utilise les facilités offertes par le Framework pour effectuer des traitements asynchrones. Il est bon de ne pas oublier ses « bases ».

 

Le délégué

 

  public delegate string DoSomethingHandler(object sender,DoSomethingEventArgs e);

 

 

  public class DoSomethingEventArgs :EventArgs 
    {
        public object Result { get; set; }
        public DoSomethingEventArgs(object result)
        {
            this.Result = result;
        }
    }

 

 

        private void button1_Click(object sender, EventArgs e)
        {
            DoSomething += new DoSomethingHandler(DoSomethingMethod);
            DoSomething.BeginInvoke(this, new DoSomethingEventArgs(null), new AsyncCallback(Callback), null);
        }
        public void Callback(IAsyncResult result)
        {
            DoSomethingHandler handler = ((AsyncResult)result).AsyncDelegate as DoSomethingHandler;
            string message = handler.EndInvoke(result);
            //  
            this.Invoke(new Action(()=> { textBox1.Text = message; }));
        }
        private string DoSomethingMethod(object sender, DoSomethingEventArgs e)
        {
            // simule un traitement long  
            for (int i = 0; i < 5; i++)
            {
                Thread.Sleep(1000);
                 this.Invoke(new Action(()=> { listBox1.Items.Add(DateTime.Now.ToString("T"));}));
            }
           
            return "un résultat quelconque"; //  
        }
        public event DoSomethingHandler DoSomething;

 

 

Pour vérifier que l’UI n’est pas bloquée on peut rajouter un bouton permettant d’afficher un message

 

  private void button2_Click(object sender, EventArgs e)
        {
            MessageBox.Show("UI réactive !");
        }

 

Repost 0
Published by Romagny13 - dans C
commenter cet article
13 avril 2014 7 13 /04 /avril /2014 18:18

Stream

  • Stream

    • FileStream

    • IsolatedStorageFileStream

    • NetWorkStream

    • SerialPort

     

    Services de flot de données

     

    • AuthenticatedStream

    • CryptoStream

    • BufferedStream

    • MemoryStream  et UnmananagedMemoryStream

    • DeflateStream et GZipStream

       

Typer le flot de données

  • BinaryReader/BinaryWriter

  • TextReader/TextWriter

    • StringReader/StringWriter

    • StreamReader/StreamWriter

       

 

Info

  • FileSystemInfo

    • DirectoryInfo

    • FileInfo

+ Exceptions,Types(Enum)

File

Simple lecture / Ecriture dans des fichiers

string value =  File.ReadAllText(path);

byte[] data = File.ReadAllBytes(path);

foreach (string line in File.ReadAllLines(path)) { }

FileStream fileStream = File.Open(path, FileMode.OpenOrCreate, FileAccess.ReadWrite);

StreamReader streamReader = File.OpenText(path);

// Exceptions

try { return File.ReadAllText(path); }

catch (DirectoryNotFoundException) { }

catch (FileNotFoundException) { }

 

File.WriteAllText(path, value);

File.WriteAllBytes(path,data);

StreamWriter streamWriter = File.AppendText(path);

 

FileStream

Ce qu’il faut pour lire/écrire un flot de données :

Stream

Encodage (UNICODE) + normes UTF-8, etc. (exemple System.Text.UTF8Encoding)

Tableau de byte [] obtenu selon l’encodage

Méthodes lecture/écriture du Stream

        public void WriteFile(string value,string path)

        {

            using (FileStream stream = File.Open(path, FileMode.OpenOrCreate, FileAccess.ReadWrite))

            {

                byte[] data = new UTF8Encoding(true).GetBytes(value);

                stream.Write(data, 0, data.Length);

            }

        }

        public string ReadFile(string path)

        {

            string result = string.Empty;

            using (FileStream stream = File.OpenRead(path))

            {

                byte[] data = new byte[stream.Length];

                for (int index = 0; index < stream.Length; index++)

                    data[index] = (byte)stream.ReadByte();

                

                result = Encoding.UTF8.GetString(data); 

            }

            return result;

        }

 

Asynchrone

        public  async Task WriteFileAsync(string path,string value)

        {     

                   using (FileStream stream = new FileStream(path, FileMode.OpenOrCreate, FileAccess.Write,FileShare.None, 4096, true))

            {

                byte[] data = new UTF8Encoding(true).GetBytes(value);

                stream.Write(data, 0, data.Length);

 

                await stream.WriteAsync(data, 0, data.Length);

            }

        }

        public async Task<string> ReadFileAsync(string path)

        {

            using (FileStream stream = new FileStream(path, FileMode.Open, FileAccess.ReadWrite))

            {

                byte[] bytes = new byte[stream.Length];

                int count = (int)stream.Length;

 

                await stream.ReadAsync(bytes, 0, (int)stream.Length);

                return Encoding.UTF8.GetString(bytes);

            }

        }

StreamReader/StreamWriter

public void WriteStream(string value,string path)

        {

            using (StreamWriter streamWriter = File.CreateText(path))

            {

                streamWriter.Write(value);

            }

        }

        public async Task WriteStreamAsync(string value, string path)

        {

            using (StreamWriter streamWriter = File.CreateText(path))

            {

               await streamWriter.WriteAsync(value);

            }

        }

        public string ReadStream(string path)

        {

            using (StreamReader streamReader = File.OpenText(path))

            {

                return streamReader.ReadToEnd();

            }

        }

        public async Task<string> ReadStreamAsync(string path)

        {

            using (StreamReader streamReader = File.OpenText(path))

            {

                return await streamReader.ReadToEndAsync();

            }

        }

WebRequest/WebResponse

flot de données distant  

  public string GetWebResponse(string uri)

        {

            WebRequest request = WebRequest.Create(uri);

            using (WebResponse response = request.GetResponse())

            {

                using (StreamReader streamReader = new StreamReader(response.GetResponseStream()))

                {

                    return streamReader.ReadToEnd();

                }

            }

        }

        public async Task<string> GetWebResponseAsync(string uri)

        {

            WebRequest request = WebRequest.Create(uri);

            using (WebResponse response = await request.GetResponseAsync())

            {

                using (StreamReader streamReader = new StreamReader(response.GetResponseStream()))

                {

                    return streamReader.ReadToEnd();

                }

            }

        }

 

FtpWebRequest

public async Task UploadFileAsync(string uri,string login,string password,string value)

        {

            FtpWebRequest request = WebRequest.Create(uri) as FtpWebRequest;

            request.Credentials = new NetworkCredential(login, password);

            request.Method = WebRequestMethods.Ftp.UploadFile;

 

            using (Stream stream = await request.GetRequestStreamAsync())

            {

                byte[] data = new UTF8Encoding(true).GetBytes(value);

                await stream.WriteAsync(data, 0, data.Length);

            }           

        }

 

Utilisation .Exemple

string value = @"<!DOCTYPE html>

<html xmlns=""http://www.w3.org/1999/xhtml"">

    <head>

        <meta http-equiv=""Content-Type"" content=""text/html; charset=utf-8"" />

    </head>

    <body>

        <h1>Page de test</h1>

    </body>

</html>";

 

 

 

await UploadFileAsync(

"ftp://ftp.nomserveur.org/index.html", "votreidentifiant", "votrepassword",value);  

 

 

+ Path

 

http://msdn.microsoft.com/fr-fr/library/system.io.path(v=vs.110).aspx

 

 

Repost 0
Published by Romagny13 - dans C
commenter cet article
12 avril 2014 6 12 /04 /avril /2014 20:31

Soit une enum quelconque .Le but étant d’afficher la valeur de la description dans les contrôles de l’UI

public enum Status 
    {
        [Description("Mon état A")]
        StateA,
        [Description("Mon état B")]
        StateB
    }
On utilise un converter
       public class EnumDescriptionConverter : IValueConverter 
    {
        public object Convert(object value,Type targetType, object parameter, CultureInfo culture)
        {
            if (value == null) return null;
            string description = GetDescription(value);
            return description;
        }
        public object ConvertBack(object value,Type targetType, object parameter, CultureInfo culture)
        {
            return value;
        }
        private static string GetDescription(object value)
        {
            FieldInfo field = value.GetType().GetField(value.ToString());
            DescriptionAttribute attribute = field.GetCustomAttribute(typeof(DescriptionAttribute), false) as DescriptionAttribute;
            string description = (attribute != null) ? attribute.Description : field.Name;
            return description;
        }
      }
Utilisation
J’ai un viewModel simple  et le DataContext de ma page réglé dessus.
  public class OrderViewModel :ViewModelBase 
    {
      private Status _orderStatus;
        public Status OrderStatus
        {
            get { return _oederStatus; }
            set 
            {
                _orderStatus = value;
                RaisePropertyChanged<Status>(() => OrderStatus);
            }
        }
    }
Pour afficher dans un contrôle de texte
    <Grid.Resources> 
            <converter:EnumDescriptionConverter x:Key="enumDescriptionConverter" />           
    </Grid.Resources>
<TextBlock Text="{Binding OrderStatus,Converter={StaticResource enumDescriptionConverter}}"/> 
Pour afficher dans une liste + sélection
<Grid.Resources> 
            <converter:EnumDescriptionConverter x:Key="enumDescriptionConverter" /> 
           
            <ObjectDataProvider x:Key="statusEnum" MethodName="GetValues" ObjectType="{x:Type sys:Enum}"> 
                <ObjectDataProvider.MethodParameters> 
                    <x:Type Type="{x:Type local:Status}" /> 
                </ObjectDataProvider.MethodParameters> 
            </ObjectDataProvider>
           
            <DataTemplate x:Key="ItemTemplateCurrent">
                <TextBlock
                       Text="{Binding .,Converter={StaticResource enumDescriptionConverter}}" />
            </DataTemplate>
        </Grid.Resources>
        <ListBox ItemsSource="{Binding Source={StaticResource statusEnum}}"
                  SelectedValue="{Binding OrderStatus}"
                  ItemTemplate="{StaticResource ItemTemplateCurrent}" />
Repost 0
Published by Romagny13 - dans MVVM
commenter cet article
12 avril 2014 6 12 /04 /avril /2014 18:07

 

State.png
L’interface , on pourrait aussi utiliser une classe abstraite et une énumération indiquant l’état clairement .
  public interface IState 
    {
        bool CanDoWork();
        void DoWork(Context context);
        Status Status { get; }
    } 
// cela pourrait être par exemple New,Canceled,Shipped etc. 
    public enum Status 
    {
        StateA,
        StateB
    }
Les états possibles, par exemple deux états A et B
  public class StateA : IState 
    {
        public Status Status
        {
            get { return Status.StateA ; }
        }
        public bool CanDoWork()
        {
            return false;
        }
        public void DoWork(Context context)
        {
            // Variante 
            //if (!CanDoWork()) 
            //    throw new NotImplementedException("message"); 
            // ou 
            context.Change(new StateB());
        }
    }
    public class StateB : IState 
    {
        public Status Status
        {
            get { return Status.StateB; }
        }
        public bool CanDoWork()
        {
            return true;
        }
        public void DoWork(Context context)
        {
            //... 
            context.Change(new StateA());
        }
    }
La classe avec laquelle on va réellement intéragir, cela pourrait être par exemple une classe Order avec plusieurs états tels que OrderNewState, OrderCanceledState,OrderShippedState …
public class Context 
    {
        private IState _state;
     

        public Status Status

        {

            get { return _state.Status; }

        }

        public Context(IState state)
        {
            this._state = state;
        }
        public bool CanDoWork()
        {
            return _state.CanDoWork();
        }
        public void DoWork()
        {
            _state.DoWork(this);
        }

        internal void Change(IState state)
        {
            this._state = state;
            RaiseStateChanged(_state);
        }
        public event EventHandler<StateChangedEventArgs> StateChanged;
        private void RaiseStateChanged(IState state)
        {
            EventHandler<StateChangedEventArgs> handler = StateChanged;
            if (handler != null)
                handler(this, new StateChangedEventArgs(state));
        }
    }
    public class StateChangedEventArgs 
    {
        private IState _state;
        public IState State
        {
            get { return _state; }
        }
        public StateChangedEventArgs(IState state)
        {
            this._state = state;
        }
    }
Utilisation
private void button1_Click(object sender, EventArgs e)
        {
            Context context = new Context(new StateA());
            context.StateChanged += context_StateChanged;
            context.DoWork();// l'état passe à StateB 
            context.DoWork();// l'état passe à StateA 
        }
        private void context_StateChanged(object sender, StateChangedEventArgs e)
        {
            MessageBox.Show(string.Format("l'état courant est : {0} ({1:T}) ",e.State,DateTime.Now));
        } 
Repost 0
Published by Romagny13 - dans Design patterns
commenter cet article
11 avril 2014 5 11 /04 /avril /2014 17:16

1- Opérateurs

           // 1 

            int? x = null;

            int y = x ?? -1; //si x est null y = -1 sinon y vaut x

 

            // 2

            int? a = null;

            int? b = 5;

            int c = a ?? b ?? -1; // c=5 si a et b avaient été "null" alors c aurait été égal à -1

 

            // 3

            bool p = false;

            int result = !p ? 0 : 1; // si p est false result = 0 sinon result=1    

 

2-string.Format() et ToString()

 

// ToString() + localisation 

decimal price = 9.99M;

MessageBox.Show(price.ToString("C",new CultureInfo("en-US")));

// string.Format 

MessageBox.Show(string.Format("{0:C}", 9.99M));


Nombres

C or c Currency $12,345.67

D or d Decimal (integer types only) 12345

E or e Scientific notation 1.234567E+004

F or f Fixed-point 12345.67

G or g General (fixed-point or scientific, whichever is shorter) 12345.67

N or n Number (with decimal and thousands separators) 12,345.67

P or p Percent (multiplied by 100 and % added) 0.12 becomes 12.00 %

X or x Hexadecimal (integer types only) 3039

 

DateTime

d: 6/15/2008

D: Sunday, June 15, 2008

f: Sunday, June 15, 2008 9:15 PM

F: Sunday, June 15, 2008 9:15:07 PM

g: 6/15/2008 9:15 PM

G: 6/15/2008 9:15:07 PM

m: June 15

o: 2008-06-15T21:15:07.0000000

R: Sun, 15 Jun 2008 21:15:07 GMT

s: 2008-06-15T21:15:07

t: 9:15 PM

T: 9:15:07 PM

u: 2008-06-15 21:15:07Z

U: Monday, June 16, 2008 4:15:07 AM

y: June, 2008

 

'h:mm:ss.ff t': 9:15:07.00 P

'd MMM yyyy': 15 Jun 2008

'HH:mm:ss.f': 21:15:07.0

'dd MMM HH:mm:ss': 15 Jun 21:15:07

'\Mon\t\h\: M': Month: 6

'HH:mm:ss.ffffzzz': 21:15:07.0000-07:00

T Long time 2:15:16 PM

y or Y Year/month March, 2014

 

Repost 0
Published by Romagny13 - dans C
commenter cet article