Overblog
Suivre ce blog Administration + Créer mon blog
23 juillet 2012 1 23 /07 /juillet /2012 07:41

Pour commencer, mettez votre document dans les Resources de votre application formaté de cette façon :

 

 <FlowDocument xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"> <Paragraph> Mon texte. </Paragraph> </FlowDocument> 

 

Vous devez importer les espaces de nom suivant :

 

 Imports System.IO 
 Imports System.Xml 
 Imports System.Xaml 
 
 
 
Ensuite il suffit d’utiliser un StringReader et un XmlReader pour récupérer le FlowDocument.
 
 Dim templateString As String = My.Resources.MonFlowDocument 
 Dim stringReader As New StringReader(templateString) 
 Dim xmlReader1 As XmlReader = XmlReader.Create(stringReader) 
 Dim template As FlowDocument = DirectCast(XamlServices.Load(xmlReader1), FlowDocument) 
 Me.RichTextBoxFlowDoc.Document = template 
Partager cet article
Repost0
11 juin 2011 6 11 /06 /juin /2011 19:33

Pour sélectionner un Item dans une ListBox il suffit de cliquer dessus, mais pour le désélectionner il faut appuyer sur la touche Ctrl puis cliquer.

Ce comportement n’est pas forcément intuitif pour un utilisateur lambda. C’est comme si vous deviez appuyer sur la touche Ctrl pour décocher un CheckBox. Ce n’est pas très logique et pratique.

 

Voici le code qui permet de désélectionner un Item simplement en recliquant dessus :

 

 Private Sub maListBox_PreviewMouseDown(sender As Object, e As System.Windows.Input.MouseButtonEventArgs) Handles maListBox.PreviewMouseDown 
 Dim dep As DependencyObject = DirectCast(e.OriginalSource, DependencyObject) 
 
 While (dep IsNot Nothing) AndAlso Not (TypeOf dep Is ListBoxItem) 
 dep = VisualTreeHelper.GetParent(dep) 
 End While 
 
 If dep Is Nothing Then 
 Return 
 End If 
 
 Dim item As ListBoxItem = DirectCast(dep, ListBoxItem) 
 
 If item.IsSelected Then 
 item.IsSelected = Not item.IsSelected 
 e.Handled = True 
 End If 
 
 End Sub 
Partager cet article
Repost0
31 mars 2011 4 31 /03 /mars /2011 14:21

Avant de pouvoir accéder aux ressources vous devez changer dans les propriétés de votre application le paramètre “Access Modifier” en “Public”.

Ensuite vous devez explicitement ajouter cette espace de nom dans votre code XAML :

 

 

 xmlns:myRes="clr-namespace:NomDeMonApplication.My.Resources" 

 

Voici maintenant un exemple pour faire un binding sur un TextBlock :

 

 <TextBlock Text="{Binding Source={x:Static myRes:Resources.NomDeMaResource}}" Name="TextBlock1" /> 
Partager cet article
Repost0
11 février 2011 5 11 /02 /février /2011 20:35

Et bien tout simplement parce que le documentViewer n’est pas un internet browser ou un frame et ne traite pas les hyperlinks par défaut.

Vous devez indiquer au documentViewer ce qu’il doit faire lorsque l’utilisateur clique sur un hyperlink dans un document XPS.

 

 

Voici l’exemple d’une fenêtre contenant un control documentViewer :

 

 

 Public Class WindowXPSViewer 
 
 
 Public Sub New(ByVal fPath As String) 
 
 ' This call is required by the designer. 
 InitializeComponent() 
 
 ' Add any initialization after the InitializeComponent() call. 
 
 
 
 Dim xps As New Xps.Packaging.XpsDocument(fPath, IO.FileAccess.Read) 
 
 DocumentViewerHelp.[AddHandler](Hyperlink.RequestNavigateEvent, New RequestNavigateEventHandler(AddressOf link_RequestNavigate)) 
 
 Me.DocumentViewerHelp.Document = xps.GetFixedDocumentSequence 
 
 Me.Title = My.Computer.FileSystem.GetFileInfo(fPath).Name 
 End Sub 
 
 Private Sub link_RequestNavigate(ByVal sender As Object, ByVal e As RequestNavigateEventArgs) 
 System.Diagnostics.Process.Start(e.Uri.ToString) 
 End Sub 
 
End Class

 

 

L’astuce réside dans le AddHandler qui va capturer l’évènement du clique sur l’hyperlink.

Partager cet article
Repost0
22 septembre 2010 3 22 /09 /septembre /2010 07:56

Pour savoir si votre control est en mode Runtime ou en mode Design utilisez le code suivant :

 

 If System.ComponentModel.DesignerProperties.GetIsInDesignMode(Me) Then 
 
 ‘ code à éxécuter en mode Design 
 
 Else 
 
 ‘code à éxécuter en mode Runtime 
 
 End If 
Partager cet article
Repost0
9 juillet 2010 5 09 /07 /juillet /2010 08:02

 

Lorsque l’on fait un clique droit sur la liste d’un Datagrid pour utiliser un menu contextuel, il est nécessaire de sélectionner la ligne sur laquelle vous avez cliqué.

 

Voici comment réaliser cette action avec le DataGrid Xceed pour WPF :

 

Code :

Private Sub DataGridListe_MouseDown(ByVal sender As Object, ByVal e As System.Windows.Input.MouseButtonEventArgs) Handles DataGridListe.MouseDown

        If e.RightButton = MouseButtonState.Pressed Then
            For Each item As DataRowView In DataGridListe.Items
                Dim row As Object = DataGridListe.GetContainerFromItem(item)
                If TypeOf row Is Xceed.Wpf.DataGrid.DataRow AndAlso DirectCast(row, Xceed.Wpf.DataGrid.DataRow).IsMouseOver Then
                    DataGridListe.CurrentItem = item
                    Exit For
                End If
            Next
        End If

End Sub

Partager cet article
Repost0
24 juin 2010 4 24 /06 /juin /2010 11:25

Lorsque vous modifiez les données de la source du Datagrid les modifications apportées ne sont pas toujours visible.

 

La solution qui vient en premier à l’esprit est d’utiliser :

 

Code:

monDataGrid.Items.Refresh()

 

Le problème c’est que si vous essayez d’appeler cette méthode dans un quelconque événement “EndEditing” du Datagrid vous aurez un message d’erreur vous indiquant que cette méthode ne peut pas être appelée durant l’édition d’un item.

 

Il est donc préférable d’utiliser la méthode suivante juste après avoir modifier les données de la source :

 

Code:

monDataGrid.CommitEdit()

Partager cet article
Repost0
12 mai 2010 3 12 /05 /mai /2010 09:01

 

Voici le code pour obtenir le TextBox d’un IsEditable=True ComboBox dans une classe qui hérite du control ComboBox :

 

Code :

Protected ReadOnly Property EditableTextBox() As TextBox
        Get
            Return DirectCast(MyBase.GetTemplateChild("PART_EditableTextBox"), TextBox)
        End Get
End Property

 

Lorsque IsDropDownOpen=True le ComboBox fait un SelectAll sur le TextBox. Pour éviter cela on peut faire ceci :

 

Code :

Me.IsDropDownOpen = True
Me.EditableTextBox.Select(Me.Text.Length, 0)

Ce code ouvre le DropDownMenu du ComboBox, désélectionne le texte du TextBox, et place le curseur à la fin du texte.

Partager cet article
Repost0
5 mai 2010 3 05 /05 /mai /2010 15:35

 

Si vous aviez l’habitude d’utiliser My.Computer.Keyboard.SendKeys avec Winform, vous avez pu constater que cela ne fonctionne pas aussi bien sous WPF.

 

Voici ce que l’on aurait fait avec Winform pour simuler l’appuie de la flèche du bas :

Code :

My.Computer.Keyboard.SendKeys("{DOWN}")

 

 

Le code suivant simule l’appuie sur la flèche du bas en WPF :

Code :

Dim kea As New KeyEventArgs(Keyboard.PrimaryDevice, Keyboard.PrimaryDevice.ActiveSource, 0, Key.Down)
kea.RoutedEvent = Keyboard.KeyDownEvent

InputManager.Current.ProcessInput(kea)

 

On obtient le même résultat avec le code suivant :

 

Code :

Dim target As System.Windows.IInputElement = Keyboard.FocusedElement
Dim kea As New KeyEventArgs(Keyboard.PrimaryDevice, Keyboard.PrimaryDevice.ActiveSource, 0, Key.Down)
kea.RoutedEvent = Keyboard.KeyDownEvent
target.RaiseEvent(kea)

 

Le second code est intéressant si vous voulez simuler l’appuie d'une touche sur un control qui n’a pas forcément le focus. Il suffit alors de modifier la variable “target”.

Partager cet article
Repost0
8 avril 2010 4 08 /04 /avril /2010 17:47

En Winform, lorsqu’une fenêtre en appelle une autre, celle-ci devient automatiquement son parent et il est facile de l’obtenir avec un simple Me.parent.

En WPF ceci n’est pas automatique. Me.Parent retournera au pire “Nothing”. Avant d’appeler votre fenêtre enfant vous devez préciser qui est son Owner.

 

Code :

Dim win As New maWindowEnfant


'défini la fenêtre active comme la fenêtre parent
Dim parent As maWindowParent = Window.GetWindow(Me)
win.Owner = parent


If win.ShowDialog() = True Then

        ‘ mon code

End If

 

 

Dans la fenêtre enfant vous pouvez maintenant retrouver la fenêtre parent de la façon suivante :

 

Code :

Dim parent As maWindowParent = Me.Owner

Partager cet article
Repost0