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
Published by Cyril
-
dans
WPF
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
Published by Cyril
-
dans
WPF
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" />
Published by Cyril
-
dans
WPF
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.
Published by Cyril
-
dans
WPF
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
Published by Cyril
-
dans
WPF
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
Published by Cyril
-
dans
WPF
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()
Published by Cyril
-
dans
WPF
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.
Published by Cyril
-
dans
WPF
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”.
Published by Cyril
-
dans
WPF
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
Published by Cyril
-
dans
WPF