Questo sito utilizza cookies, anche di terze parti, per mostrare pubblicità e servizi in linea con il tuo account. Leggi l'informativa sui cookies.
Username: Password: oppure
C# / VB.NET - [Vb.Net] Aiuto convertire codice per WinForm in codice per WPF
Forum - C# / VB.NET - [Vb.Net] Aiuto convertire codice per WinForm in codice per WPF

Avatar
amreo (Normal User)
Pro


Messaggi: 93
Iscritto: 18/03/2013

Segnala al moderatore
Postato alle 17:47
Sabato, 23/03/2013
io ho il seguente codice per Win form
Codice sorgente - presumibilmente VB.NET

  1. Imports System
  2. Imports System.Drawing
  3. Public Class SyntaxRTB
  4.     Inherits System.Windows.Forms.RichTextBox
  5.  
  6.     'La funzione SendMessage serve per inviare dati messaggi
  7.     'a una finestra o un dispositivo allo scopo di ottenere
  8.     'dati valori od eseguire dati compiti
  9.     Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" _
  10.        (ByVal hWnd As IntPtr, ByVal wMsg As Integer, _
  11.        ByVal wParam As Integer, ByVal lParam As Integer) As Integer
  12.  
  13.     'Blocca il Refresh della finestra
  14.     Private Declare Function LockWindowUpdate Lib "user32" _
  15.         (ByVal hWnd As Integer) As Integer
  16.  
  17.     'Campo privato che specifica se il meccanismo di syntax
  18.     'highlighting è case sensitive oppure no
  19.     Private _SyntaxHighlight_CaseSensitive As Boolean = False
  20.     'La tabella delle parole
  21.     Public KeyWords As New DataTable
  22.  
  23.     Public Property CaseSensitive() As Boolean
  24.         Get
  25.             Return _SyntaxHighlight_CaseSensitive
  26.         End Get
  27.         Set(ByVal Value As Boolean)
  28.             _SyntaxHighlight_CaseSensitive = Value
  29.         End Set
  30.     End Property
  31.  
  32.     'Contiene costanti usate nell'inviare messaggi all'API
  33.     'di windows
  34.     Private Enum EditMessages
  35.         LineIndex = 187
  36.         LineFromChar = 201
  37.         GetFirstVisibleLine = 206
  38.         CharFromPos = 215
  39.         PosFromChar = 1062
  40.     End Enum
  41.  
  42.     'OnTextChanged è una procedura privata che ha il compito
  43.     'di generare l'evento TextChanged: prima di farlo, colora il
  44.     'testo, ma in questo caso l'evento non viene più generato
  45.     Protected Overrides Sub OnTextChanged(ByVal e As EventArgs)
  46.         ColorVisibleLines()
  47.     End Sub
  48.  
  49.     'Colora tutta la RichTextBox
  50.     Public Sub ColorRtb()
  51.         Dim FirstVisibleChar As Integer
  52.         Dim i As Integer = 0
  53.  
  54.         While i < Me.Lines.Length
  55.             FirstVisibleChar = GetCharFromLineIndex(i)
  56.             ColorLineNumber(i, FirstVisibleChar)
  57.             i += 1
  58.         End While
  59.     End Sub
  60.  
  61.     'Colora solo le linee visibili
  62.     Public Sub ColorVisibleLines()
  63.         Dim FirstLine As Integer = FirstVisibleLine()
  64.         Dim LastLine As Integer = LastVisibleLine()
  65.         Dim FirstVisibleChar As Integer
  66.  
  67.         If (FirstLine = 0) And (LastLine = 0) Then
  68.             'Non c'è testo
  69.             Exit Sub
  70.         Else
  71.             While FirstLine < LastLine
  72.                 FirstVisibleChar = GetCharFromLineIndex(FirstLine)
  73.                 ColorLineNumber(FirstLine, FirstVisibleChar)
  74.                 FirstLine += 1
  75.             End While
  76.         End If
  77.  
  78.     End Sub
  79.  
  80.     'Colora una linea all'indice LineIndex, a partire dal carattere
  81.     'lStart
  82.     Public Sub ColorLineNumber(ByVal LineIndex As Integer, _
  83.         ByVal lStart As Integer)
  84.         Dim i As Integer = 0
  85.         Dim SelectionAt As Integer = Me.SelectionStart
  86.         Dim MyRow As DataRow
  87.         Dim Line() As String, MyI As Integer, MyStr As String
  88.  
  89.         'Blocca il refresh
  90.         LockWindowUpdate(Me.Handle.ToInt32)
  91.  
  92.         MyI = lStart
  93.  
  94.         If CaseSensitive Then
  95.             Line = Split(Me.Lines(LineIndex).ToString, " ")
  96.         Else
  97.             Line = Split(Me.Lines(LineIndex).ToLower, " ")
  98.         End If
  99.  
  100.         For Each MyStr In Line
  101.             'Seleziona i primi MyStr.Length caratteri della linea,
  102.             'ossia la prima parola
  103.             Me.SelectionStart = MyI
  104.             Me.SelectionLength = MyStr.Length
  105.  
  106.             'Se la parola è contenuta in una delle righe
  107.             If KeyWords.Rows.Contains(MyStr) Then
  108.                 'Seleziona la riga
  109.                 MyRow = KeyWords.Rows.Find(MyStr)
  110.                 'Quindi colora la parola prelevando il colore da
  111.                 'tale riga
  112.                 If (Not CaseSensitive) Or _
  113.                     (CaseSensitive And MyRow("Word") = MyStr) Then
  114.                     Me.SelectionColor = Color.FromName(MyRow("Color"))
  115.                 End If
  116.             Else
  117.                 'Altrimenti lascia il testo in nero
  118.                 Me.SelectionColor = Color.Black
  119.             End If
  120.  
  121.             'Aumenta l'indice di un fattore pari alla lunghezza
  122.             'della parola più uno (uno spazio)
  123.             MyI += MyStr.Length + 1
  124.         Next
  125.  
  126.         'Ripristina la selezione
  127.         Me.SelectionStart = SelectionAt
  128.         Me.SelectionLength = 0
  129.         'E il colore
  130.         Me.SelectionColor = Color.Black
  131.  
  132.         'Riprende il refresh
  133.         LockWindowUpdate(0)
  134.     End Sub
  135.  
  136.     'Ottiene il primo carattere della linea LineIndex
  137.     Public Function GetCharFromLineIndex(ByVal LineIndex As Integer) _
  138.         As Integer
  139.         Return SendMessage(Me.Handle, EditMessages.LineIndex, LineIndex, 0)
  140.     End Function
  141.  
  142.     'Ottiene la prima linea visibile
  143.     Public Function FirstVisibleLine() As Integer
  144.         Return SendMessage(Me.Handle, EditMessages.GetFirstVisibleLine, 0, 0)
  145.     End Function
  146.  
  147.     'Ottiene l'ultima linea visibile
  148.     Public Function LastVisibleLine() As Integer
  149.         Dim LastLine As Integer = FirstVisibleLine() + _
  150.             (Me.Height / Me.Font.Height)
  151.  
  152.         If LastLine > Me.Lines.Length Or LastLine = 0 Then
  153.             LastLine = Me.Lines.Length
  154.         End If
  155.  
  156.         Return LastLine
  157.     End Function
  158.  
  159.     Public Sub New()
  160.  
  161.         Me.AcceptsTab = True
  162.  
  163.         'Carica la colonna Word e Color
  164.         KeyWords.Columns.Add("Word")
  165.         KeyWords.PrimaryKey = New DataColumn() {KeyWords.Columns(0)}
  166.         KeyWords.Columns.Add("Color")
  167.  
  168.         'Aggiunge le keywords del linguaggio SQL all'array
  169.        
  170.  
  171.         'Quindi le aggiunge una alla volta alla tabella con
  172.         'colore rosso
  173.  
  174.     End Sub
  175.  
  176.     Sub AddSqlWords()
  177.         Dim MyRow As DataRow
  178.         Dim arrKeyWords() As String, strKW As String
  179.  
  180.         arrKeyWords = New String() {"select", "INSERT IGNORE", "delete", _
  181.           "truncate", "from", "where", "into", "inner", "update", _
  182.           "outer", "on", "is", "declare", "set", "use", "values", "as", _
  183.           "order", "by", "drop", "view", "go", "trigger", "cube", _
  184.           "binary", "varbinary", "image", "char", "varchar", "text", _
  185.           "datetime", "smalldatetime", "decimal", "numeric", "float", _
  186.           "real", "bigint", "int", "smallint", "tinyint", "money", _
  187.           "smallmoney", "bit", "cursor", "timestamp", "uniqueidentifier", _
  188.           "sql_variant", "table", "nchar", "nvarchar", "ntext", "left", _
  189.           "right", "like", "and", "all", "in", "null", "join", "not", "or"}
  190.  
  191.         For Each strKW In arrKeyWords
  192.             MyRow = KeyWords.NewRow()
  193.             MyRow("Word") = strKW
  194.             MyRow("Color") = Color.LightCoral.Name
  195.             KeyWords.Rows.Add(MyRow)
  196.         Next
  197.     End Sub
  198. End Class


e devo convertirlo per WPF.
sono riuscito a convertirlo parzialmente.
(
Codice sorgente - presumibilmente VB.NET

  1. Public Class CustomControl1
  2.     Inherits Control
  3.  
  4.     Shared Sub New()
  5.  
  6.     End Sub
  7.  
  8. End Class
  9.  
  10. Public Class SyntaxRTB
  11.     Inherits Controls.RichTextBox
  12.  
  13.     'La funzione SendMessage serve per inviare dati messaggi
  14.     'a una finestra o un dispositivo allo scopo di ottenere
  15.     'dati valori od eseguire dati compiti
  16.     Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" _
  17.        (ByVal hWnd As IntPtr, ByVal wMsg As Integer, _
  18.        ByVal wParam As Integer, ByVal lParam As Integer) As Integer
  19.  
  20.     'Blocca il Refresh della finestra
  21.     Private Declare Function LockWindowUpdate Lib "user32" _
  22.         (ByVal hWnd As Integer) As Integer
  23.  
  24.     'Campo privato che specifica se il meccanismo di syntax
  25.     'highlighting è case sensitive oppure no
  26.     Private _SyntaxHighlight_CaseSensitive As Boolean = False
  27.     'La tabella delle parole
  28.     Public KeyWords As New DataTable '***** Primo dubbio: sostituire DataTable in Data.DataTable
  29.  
  30.     Public Property CaseSensitive() As Boolean
  31.         Get
  32.             Return _SyntaxHighlight_CaseSensitive
  33.         End Get
  34.         Set(ByVal Value As Boolean)
  35.             _SyntaxHighlight_CaseSensitive = Value
  36.         End Set
  37.     End Property
  38.  
  39.     'Contiene costanti usate nell'inviare messaggi all'API
  40.     'di windows
  41.     Private Enum EditMessages
  42.         LineIndex = 187
  43.         LineFromChar = 201
  44.         GetFirstVisibleLine = 206
  45.         CharFromPos = 215
  46.         PosFromChar = 1062
  47.     End Enum
  48.  
  49.     'OnTextChanged è una procedura privata che ha il compito
  50.     'di generare l'evento TextChanged: prima di farlo, colora il
  51.     'testo, ma in questo caso l'evento non viene più generato
  52.     Protected Overrides Sub OnTextChanged(e As System.Windows.Controls.TextChangedEventArgs)
  53.         ColorVisibleLines()
  54.     End Sub
  55.  
  56.     'Colora tutta la RichTextBox
  57.     Public Sub ColorRtb()
  58.         Dim FirstVisibleChar As Integer
  59.         Dim i As Integer = 0
  60.  
  61.         While i < Me.Lines.Length '************ Me.Lines non esiste in WPF: qual' è il suo equivalente in WPF
  62.             FirstVisibleChar = GetCharFromLineIndex(i)
  63.             ColorLineNumber(i, FirstVisibleChar)
  64.             i += 1
  65.         End While
  66.     End Sub
  67.  
  68.     'Colora solo le linee visibili
  69.     Public Sub ColorVisibleLines()
  70.         Dim FirstLine As Integer = FirstVisibleLine()
  71.         Dim LastLine As Integer = LastVisibleLine()
  72.         Dim FirstVisibleChar As Integer
  73.  
  74.         If (FirstLine = 0) And (LastLine = 0) Then
  75.             'Non c'è testo
  76.             Exit Sub
  77.         Else
  78.             While FirstLine < LastLine
  79.                 FirstVisibleChar = GetCharFromLineIndex(FirstLine)
  80.                 ColorLineNumber(FirstLine, FirstVisibleChar)
  81.                 FirstLine += 1
  82.             End While
  83.         End If
  84.  
  85.     End Sub
  86.  
  87.     'Colora una linea all'indice LineIndex, a partire dal carattere
  88.     'lStart
  89.     Public Sub ColorLineNumber(ByVal LineIndex As Integer, _
  90.         ByVal lStart As Integer)
  91.         Dim i As Integer = 0
  92.         Dim SelectionAt As Integer = Me.SelectionStart '************ Me.SelectionStart non esiste in WPF: qual' è il suo equivalente in WPF?
  93.         Dim MyRow As DataRow  '************ Neanche DataRow
  94.         Dim Line() As String, MyI As Integer, MyStr As String
  95.  
  96.         'Blocca il refresh
  97.         LockWindowUpdate(Me.Handle.ToInt32)  '************ Me.Handle
  98.  
  99.         MyI = lStart
  100.  
  101.         If CaseSensitive Then
  102.             Line = Split(Me.Lines(LineIndex).ToString, " ") '************ Me.Lines
  103.         Else
  104.             Line = Split(Me.Lines(LineIndex).ToLower, " ") '************ Me.Lines
  105.         End If
  106.  
  107.         For Each MyStr In Line
  108.             'Seleziona i primi MyStr.Length caratteri della linea,
  109.             'ossia la prima parola
  110.             Me.SelectionStart = MyI '************ Me.SelectionStart
  111.             Me.SelectionLength = MyStr.Length '************ Me.SelectionLenght
  112.  
  113.             'Se la parola è contenuta in una delle righe
  114.             If KeyWords.Rows.Contains(MyStr) Then
  115.                 'Seleziona la riga
  116.                 MyRow = KeyWords.Rows.Find(MyStr)
  117.                 'Quindi colora la parola prelevando il colore da
  118.                 'tale riga
  119.                 If (Not CaseSensitive) Or _
  120.                     (CaseSensitive And MyRow("Word") = MyStr) Then
  121.                     Me.SelectionColor = Color.FromName(MyRow("Color")) '************ Me.SelectionColor e Color.FromName
  122.                 End If
  123.             Else
  124.                 'Altrimenti lascia il testo in nero
  125.                 Me.SelectionColor = Color.Black '************ Me.SelectionColor e Color.Black
  126.             End If
  127.  
  128.             'Aumenta l'indice di un fattore pari alla lunghezza
  129.             'della parola più uno (uno spazio)
  130.             MyI += MyStr.Length + 1
  131.         Next
  132.  
  133.         'Ripristina la selezione
  134.         Me.SelectionStart = SelectionAt '************ Me.SelectionStart
  135.         Me.SelectionLength = 0 '************ Me.SelectionLenght
  136.         'E il colore
  137.         Me.SelectionColor = Color.Black '************ Me.SelectionColor e Color.Black
  138.  
  139.         'Riprende il refresh
  140.         LockWindowUpdate(0)
  141.     End Sub
  142.  
  143.     'Ottiene il primo carattere della linea LineIndex
  144.     Public Function GetCharFromLineIndex(ByVal LineIndex As Integer) _
  145.         As Integer
  146.         Return SendMessage(Me.Handle, EditMessages.LineIndex, LineIndex, 0) '************ Me.Handle
  147.     End Function
  148.  
  149.     'Ottiene la prima linea visibile
  150.     Public Function FirstVisibleLine() As Integer
  151.         Return SendMessage(Me.Handle, EditMessages.GetFirstVisibleLine, 0, 0) '************ Me.Handle
  152.     End Function
  153.  
  154.     'Ottiene l'ultima linea visibile
  155.     Public Function LastVisibleLine() As Integer
  156.         Dim LastLine As Integer = FirstVisibleLine() + _
  157.             (Me.Height / Me.Font.Height) '************ Me.Font
  158.  
  159.         If LastLine > Me.Lines.Length Or LastLine = 0 Then '************ Me.Lines
  160.             LastLine = Me.Lines.Length '************ Me.Lines
  161.         End If
  162.  
  163.         Return LastLine
  164.     End Function
  165.  
  166.     Public Sub New()
  167.  
  168.         'Questa chiamata OverrideMetadata indica al sistema che l'elemento fornisce uno stile diverso dalla relativa classe base.
  169.         'Questo stile viene definito in Themes\Generic.xaml
  170.         DefaultStyleKeyProperty.OverrideMetadata(GetType(CustomControl1), New FrameworkPropertyMetadata(GetType(CustomControl1)))
  171.         Me.AcceptsTab = True
  172.  
  173.         'Carica la colonna Word e Color
  174.         KeyWords.Columns.Add("Word")
  175.         KeyWords.PrimaryKey = New DataColumn() {KeyWords.Columns(0)} '************ DataColumn
  176.         KeyWords.Columns.Add("Color")
  177.  
  178.         'Aggiunge le keywords del linguaggio SQL all'array
  179.  
  180.  
  181.         'Quindi le aggiunge una alla volta alla tabella con
  182.         'colore rosso
  183.  
  184.     End Sub
  185.  
  186.     Sub AddSqlWords()
  187.         Dim MyRow As DataRow '************ DataRow
  188.         Dim arrKeyWords() As String, strKW As String
  189.  
  190.         arrKeyWords = New String() {"select", "INSERT IGNORE", "delete", _
  191.           "truncate", "from", "where", "into", "inner", "update", _
  192.           "outer", "on", "is", "declare", "set", "use", "values", "as", _
  193.           "order", "by", "drop", "view", "go", "trigger", "cube", _
  194.           "binary", "varbinary", "image", "char", "varchar", "text", _
  195.           "datetime", "smalldatetime", "decimal", "numeric", "float", _
  196.           "real", "bigint", "int", "smallint", "tinyint", "money", _
  197.           "smallmoney", "bit", "cursor", "timestamp", "uniqueidentifier", _
  198.           "sql_variant", "table", "nchar", "nvarchar", "ntext", "left", _
  199.           "right", "like", "and", "all", "in", "null", "join", "not", "or"}
  200.  
  201.         For Each strKW In arrKeyWords
  202.             MyRow = KeyWords.NewRow()
  203.             MyRow("Word") = strKW
  204.             MyRow("Color") = Color.LightCoral.Name '************ Color.LightCoral.Name
  205.             KeyWords.Rows.Add(MyRow)
  206.         Next
  207.     End Sub
  208. End Class


)

PM Quote
Avatar
HeDo (Founder Member)
Guru^2


Messaggi: 2763
Iscritto: 21/09/2007

Segnala al moderatore
Postato alle 15:18
Domenica, 24/03/2013

convertire da winforms a wpf in questo modo non ha senso, tanto vale rimanere su winforms.
wpf è un tecnologia che va programmata in maniera totalmente differente se la si vuole sfruttare appieno.
non so se le mie parole cadranno nel vuoto, molto probabilmente si, ma non mi importa.
studia il pattern MVVM: http://en.wikipedia.org/wiki/Model_View_ViewModel e il framework MvvmLight http://mvvmlight.codeplex.com/documentation



Ingegnere Informatico
https://ldlagency.it
PM Quote
Avatar
amreo (Normal User)
Pro


Messaggi: 93
Iscritto: 18/03/2013

Segnala al moderatore
Postato alle 18:20
Domenica, 24/03/2013
Ho capito(a metà). faccio la mia applicazione solo per winform. però ho perso un sacco di tempo :( :( :( :( :( :( :( :d:d:d:d:d:d:d:d:d:d:d:d:d:d

PM Quote
Avatar
amreo (Normal User)
Pro


Messaggi: 93
Iscritto: 18/03/2013

Segnala al moderatore
Postato alle 18:21
Domenica, 24/03/2013
Ho capito(a metà). faccio la mia applicazione solo per winform. però ho perso un sacco di tempo :( :( :( :( :( :( :( :d:d:d:d:d:d:d:d:d:d:d:d:d:d
oppure come faccio convertite in modo che ha senso?

PM Quote