Строки обновления WPF

#wpf #vb.net #graphics #draw

#wpf #vb.net #графика #рисовать

Вопрос:

Я пытаюсь выполнить репликацию в wpf (vb.net ) приложение, которое я создал несколько раз назад в winform. В старом приложении я в основном открываю двоичный файл и загружаю его в один массив, а затем рисую с его помощью диаграмму 2d lines. Файлы размером примерно 2-4 МБ, поэтому я устанавливаю ползунок и каждый раз, когда я его меняю, я вызываю вспомогательный модуль рисования со смещением ползунка. Теперь я совершенно новичок в wpf, я выясняю, как рисовать диаграмму, но я не понимаю, как обновлять ее при перемещении ползунка или (следующий шаг) при изменении значений массива с помощью кода. Чтобы выполнить простые тесты, я загружаю файл при запуске, и при нажатии кнопки 1 я изменяю значения массива, и я бы увидел диаграмму обновления, но я не нашел способа.

     <Window x:Class="MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:testwpf2d"
        mc:Ignorable="d"
        Title="MainWindow" Height="1920" Width="1080">
    <Grid x:Name="BaseGrid">
        <Canvas  Name="paintSurface" >
            <Canvas.Background>
                <SolidColorBrush Color="Black" Opacity="1"/>
            </Canvas.Background>
            <Button Content="Button" Canvas.Left="184" Canvas.Top="36" Width="75" Click="Button_Click"/>
        </Canvas>
    </Grid>
</Window>


Private Sub BaseGrid_Loaded(sender As Object, e As RoutedEventArgs) Handles BaseGrid.Loaded
    Dim openFileDialogORI As OpenFileDialog = New OpenFileDialog()

    If openFileDialogORI.ShowDialog = True Then
        Try
            Dim MyFileORIStream As FileStream = New FileStream(openFileDialogORI.FileName, FileMode.Open, FileAccess.Read)
            Dim ORIBuffer As BinaryReader = New BinaryReader(MyFileORIStream)
            Dim fInfo As New FileInfo(openFileDialogORI.FileName)
            Dim numBytes As Long = fInfo.Length

            MyORIArray = ORIBuffer.ReadBytes(CInt(numBytes))

            ORIBuffer.Close()
            MyFileORIStream.Close()
          
            Dim NomeFileOri As String = openFileDialogORI.FileName
            Dim info As New FileInfo(openFileDialogORI.FileName)
            Dim length As Integer = CInt(info.Length)                
        Catch ex As Exception
            MsgBox(ex.Message)
        End Try
    End If
    MessageBox.Show("File loaded")

    For i As Integer = 1 To 2000
        Dim Line As New Line
        Line.X1 = i
        Line.X2 = i   1
        Line.Y1 = MyORIArray(i)
        Line.Y2 = MyORIArray(i   1)
        Line.Stroke = Brushes.YellowGreen
        Line.StrokeThickness = 0.25
        BaseGrid.Children.Add(Line)
    Next
End Sub

Private Sub Button_Click(sender As Object, e As RoutedEventArgs)
    Dim Rand As New Random

    For i As Integer = 1 To 1000
        MyORIArray(i) = Rand.NextDouble * 50
    Next
    MessageBox.Show("new data ")
    BaseGrid.UpdateLayout()
    paintSurface.UpdateLayout()
End Sub
  

Комментарии:

1. Вместо рисования 2000 строк рассмотрите возможность использования одной полилинии. Это было бы намного эффективнее. Добавьте полилинию один раз на холст, а затем обновите только ее свойство Points.

2. Я протестировал ваш совет, и это простая работа, но время обновления очень медленное..

Ответ №1:

Я решил создать коллекцию точек из массива и нарисовать ломаную линию, при изменении arraypoint (всегда при взаимодействии с пользователем, которое вызывает событие (кнопка, мышь и т.д.), Я обновляю или воссоздаю коллекцию точек, А затем использую update.макет. Я понимаю, что это не лучший способ, но для этого небольшого приложения работа хорошая