Mercredi 16 avril 2008

Il est possible que vous rencontriez une exception sur l'utilisation du webclient. L'exception est la suivante :

An exception of type 'System.Security.SecurityException' occurred in System.Windows.dll but was not handled in user code

Additional information: Security error.

J'ai eu du mal à comprendre pourquoi une telle erreur alors que le code venait d'un exemple trouvé sur le net !


WebClient
wcli = new WebClient();

wcli.OpenReadCompleted += new OpenReadCompletedEventHandler(wcli_OpenReadCompleted);

wcli.OpenReadAsync(new Uri("http://www.myxaml.fr/mycv/img/monimage.png", UriKind.Absolute));


En réalité c'est simplement lié à l'exécution directe du projet silverlight à partir du system de fichier local.

Pour éviter cette exception il faut simplement créer un web projet et y intégrer l'application silverlight. Pour y parvenir ajoutez à votre solution un nouveau projet de type web application. Dans l'explorateur de solution sur votre projet web, le menu propose l'ajout d'un lien vers une application silverlight.

 


L'assistant de configuration permet de choisir une application silverlight existante ou proposera d'en créer une nouvelle.

 

Nous nous retrouvons au final avec une application Web contenant le répertoire ClientBin avec la solution SilverLight à l'intérieur.

 

Il ne reste plus qu'a définir l'application Web comme projet de démarrage et plus de problème en ce qui concerne de téléchargement à la demande via le WebClient.

par pascal cabanel publié dans : SilverLight
ajouter un commentaire commentaires (1)    recommander
Lundi 14 avril 2008

System.Windows.Browser.HtmlPage.Window.Navigate(new Uri("http://pcabanel.over-blog.com/"));

par pascal cabanel publié dans : SilverLight
ajouter un commentaire commentaires (0)    recommander
Samedi 12 avril 2008

Avec WPF tester le double clic sur un contrôle est relativement simple. Il suffit de tester la propriété clickCount sur l'évènement MouseDown.

private void StackPanel_MouseDown(object sender, MouseButtonEventArgs e)

{

  if (e.ClickCount == 2)

    MessageBox.Show("DbClick")

}

Avec SilverLight 2.0 c'est une autre histoire… L'évènement disponible sur la plupart des contrôles est le MouseLeftButtonDown qui ne dispose pas d'élément permettant la détection du double clic. Pour palier à ce manque, une solution consiste à mesurer le temps qui sépare deux clics.


public
long LastMouseDown = 0;

private void StackPanel_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)

{

   if ((DateTime.Now.Ticks - LastMouseDown) < 2310000)

   {

      // double click

   }

   LastMouseDown = DateTime.Now.Ticks;

}

par pascal cabanel publié dans : SilverLight
ajouter un commentaire commentaires (0)    recommander
Samedi 1 mars 2008

J'ai découverts en fouinant ;) dans le fichier de configuration d'un projet XBAP, la possibilité géniale de transformer la solution en une application autonome. Plus besoin d'IE pour exécuter l'application. C'est surtout très utile en conception car l'application en Debug se lance bien plus vite qu'avec IE.

Pour y parvenir rien de plus simple. Editez le fichier csproj de votre projet et changez <HostInBrowser>true</HostInBrowser> par false. Il ne reste plus qu'a préciser le mode d'exécution pour le Debug

Utilisez Start projet à la place de PresentationHost.exe et le tour est jouéJ.

 DebugXBAPEXE.JPG

par pascal cabanel publié dans : XBAP
ajouter un commentaire commentaires (0)    recommander
Samedi 1 mars 2008

Après la migration d'une application XBAP de VS2005 vers VS2008, j'ai constaté une erreur de déploiement incompréhensible. Alors que tout fonctionnait sous vs2005, me voila confronté à l'erreur suivante :

<< Cannot publish because a project failed to build. >> Avec une bonne liste d'erreur indiquant Source file 'C:..Fichier.g.i.cs' could not be found

Au moment de l'écriture de ce billet, il existe deux solutions la plus rapide étant d'incrémenter tout simplement le N° de publication : 

Capturer.JPG

 

Sinon une autre alternative consiste à :

  • Passer en mode release.
  • Fermer tous les fichiers ouverts dans VS.
  • Fermer vs2008.
  • Rouvrir la solution sans rien faire de plus.
  • Publier le projet.

Pour plus de détails sur les solutions de contournements c'est ici.

par pascal cabanel publié dans : XBAP
ajouter un commentaire commentaires (0)    recommander
Samedi 17 novembre 2007

Si vous effectuez un Binding sur une propriété de type string avec un type Nullable, cela ne fonctionnera pas correctement. A première vu tout semble normal, la saisie dans le champ de type texte alimente correctement le type Nullable. Mais lorsque le champ est vidé bizarrement le type Nullable conserve son ancienne valeur.

La raison est qu'une chaine vide est traduite comme string.Empty et non null. string.
La solution consiste à utiliser une implémentation d'IValueConverter afin de préciser la transformation souhaité.Empty en null et le tour est joué J.
Dans l'exemple ci-dessous le binding est réalisé entre un TextBox et une propriété Nullable<int>.

Voici la classe qui implémente IConverter :

public class TextToNullableConverter : IValueConverter

{

  public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)

  {

    if (value == null)

       return String.Empty;

    else

       return value.ToString(); 
  }

  public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)

  {  

     if (value.ToString().Length > 0)

        return value.ToString();

     else

        return null;

   }

}

Et voici commenter affecter le converter au moment du binding.

Binding myBinding;

int ? MonTypeNullable = 10;

myBinding = new Binding("MyTextBox");

myBinding.Converter = new TextToNullableConverter();

myBinding.Source = MonTypeNullable;

TextBox MyTextBox = new TextBox();

MyTextBox.SetBinding(TextBox.TextProperty, myBinding);

par pascal cabanel publié dans : WPF
ajouter un commentaire commentaires (0)    recommander
Mardi 16 octobre 2007

Avec WPF, construire la vignette (miniature) d'une page est très simple. Il suffit simplement d'associer un VisualBrush dans les ressources de la page et de l'utiliser comme background pour l'objet qui servira à l'affichage de la vignette.

  1. Ajout du VisualBrush à la page

<Page.Resources>

<VisualBrush x:Key="VisualPageBrush" Visual="{Binding ElementName=grid}" Stretch="Uniform"/>

</Page.Resources>

Pour permettre la reproduction de l'écran dans une vignette, il faut effectuer un Binding sur le contrôle principal de la page. Dans cet exemple il s'agit d'un Grid.

<Grid x:Name="grid">

...

</Grid>

  1. Récupération du VisualBrush de chaque page et création du thumbView

Dans l'exemple ci-dessous c'est un ListBox qui sera utilisé pour afficher les vignettes. La première étape consiste à allouer les différentes pages. Puis à construire le thumbView simplement en ajoutant des objets de type ListBoxItem dont le contenu n'est qu'un border. Le border lui utilise le VisualBrush pour sa propriété Background et le tour est joué.

public Page1()

{

  InitializeComponent();

  Page2 page2 = new Page2();

  Page3 page3 = new Page3();

  Page4 page4 = new Page4();

 

  CreateThumb(page2);

  CreateThumb(page3);

  CreateThumb(page4);

}

private void CreateThumb(Page page)

{

  VisualBrush vbr = page.Resources["VisualPageBrush"] as VisualBrush;

  if (vbr != null)

  {

    Border thumbBorder = new Border();

    thumbBorder.Margin = new Thickness(0, 5, 0, 5);

    thumbBorder.BorderThickness = new Thickness(1, 1, 1, 1);

    thumbBorder.Background = vbr;

    thumbBorder.Width = 100;

    thumbBorder.Height = 100;

 

    ListBoxItem newItem = new ListBoxItem();

    newItem.Content = thumbBorder;

 

    Frame frm = new Frame();

    frm.Content = page;

    lstBox.Items.Add(newItem);

  }

}

par pascal cabanel publié dans : WPF
ajouter un commentaire commentaires (0)    recommander
Vendredi 5 octobre 2007
C’est en voulant faire un test sur une application XBAP que j’ai rencontré une violation d’accès juste après avoir appliqué un BitmapEffect . En fait les BitmapEffect s’appuient sur les API système. Dans la SandBox, une application ne peut pas accéder aux ressources système.C’est donc la raison de cette erreur d’exécution. Pour résoudre ce problème, il faut changer les permissions de l’application. Le plus rapide étant d’utiliser le mode Full Trust.

Security.jpg

Seulement ce n’est pas si simple… Car l’application va fonctionner que dans la mesure ou elle est lancée depuis Visual studio. Dès lors qu’elle sera déployée celle-ci affichera le message ci-dessous :

Confiance.jpg

Pour faire fonctionner malgré tout cette application, il faudra prévoir l’utilisation d’un certificat numérique.
Conclusion mieux vaut éviter l’utilisation des BitmapEffect qui d’ailleurs posent pouvant des problèmes de performance.
par pascal cabanel publié dans : XBAP
ajouter un commentaire commentaires (0)    recommander
Vendredi 27 juillet 2007
L’utilisation d’un CellTemplate avec un contrôle comme un ProgressBar ou une ComboBox tronque l’affichage. Ce phénomène est lié au fait qu’une cellule d’un ListView a une marge à gauche et à droite. Ainsi le Binding sur la propriété Width ne convient pas pour un affichage complet du controle.

CellTemplate1.JPG




Pour palier à ce problème une solution consiste à utiliser un Converter spécifique au moment du Binding pour retirer les pixels nécessaires. Grace au converter, une cellule de 120 px par exemple fournira au moment d'une Binding 100 px.

1 - Définir une classe qui implémente IValueConverter

    public class CellWidthConverter : IValueConverter

    {

        public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)

        {

            int iValue;

            int.TryParse(value.ToString(), out iValue);

            return iValue - 20;

        }

        public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)

        {

        string strValue = value.ToString();

        int result;

        if (int.TryParse(strValue, out result))

        {

            return result;

        }

        return value;

        }

    } 

 

2 – Dans les ressources déclarer  la classe ainsi :

<Window.Resources>

  <local:CellWidthConverter x:Key="CellWidthConverter" />

</Window.Resources>

3 - Utilisation du converter au moment du Binding :

<GridViewColumn  Header="Avancement" Width="120" x:Name="colAvancement">

    <GridViewColumn.CellTemplate>

      <DataTemplate>

         <ProgressBar Width="{Binding ElementName=colAvancement, Path=Width, Converter={StaticResource CellWidthConverter}}" Height="15" Value="{Binding Path=AVANCEMENT}"/>

       </DataTemplate>

     </GridViewColumn.CellTemplate>

</GridViewColumn>


CellTemplate2.JPG
par pascal cabanel publié dans : WPF
ajouter un commentaire commentaires (0)    recommander
Vendredi 27 juillet 2007

J'ai rencontré une erreur de déploiement clickOnce en utilisant une application XBAP sous Vista.
L'erreur est la suivante :

XBapError.JPG











Voici les informations que retourne le journal d'erreur :

Les erreurs suivantes ont été détectées au cours de cette opération.
 *  System.Runtime.InteropServices.COMException
  - L'assemblage référencé n'est pas installé sur votre système. (Exception de HRESULT : 0x800736B3)
...

J'ai cherché un moment avant de trouver une solution viable...
- supprimer le répertoire 2.0 qui se trouve dans :

%userprofile%/local settings/apps

- exécuter mage.exe -cc (le répertoire 2.0 sera recrée)
Se trouve dans le répertoire ci-dessous :

C:/Program Files/Microsoft Visual Studio 8/SDK/v2.0/Bin/mage.exe



Mage.exe -cc vide le répertoire de stockage de clickonce et l'erreur disparait.
par pascal cabanel publié dans : XBAP
ajouter un commentaire commentaires (1)    recommander
Créer un blog sur over-blog.com - Contact - C.G.U. - Rémunération en droits d'auteur avec TF1 Network - Signaler un abus