Взаимодействие с интерфейсом WPF отстает, но почему?
Чтобы продемонстрировать мою проблему, я кодировал простой пример ниже, который рисует кривую, и черная линия, которая следует за курсором.
Может кто-нибудь объяснить, почему, когда я увеличиваю "numPointsMul", взаимодействие с мышью и рисование линии курсора становится очень медленным?
Почему количество точек на графике влияет на рисование указателя таким образом? Обратите внимание, что я отключил все проверки попаданий, а график перерисовывается только в OnRender
,
Я понимаю, что увеличение количества очков может привести к OnRender
функция занимает больше времени, но я не понимаю, почему это приведет к задержке рисования указателя, так как OnRender
вызывается не при перемещении курсора, а при событиях Invalidation. Похоже, тестирование на удар все еще продолжается?
<Window x:Class="WpfApplication4.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:WpfApplication4"
Title="MainWindow" Height="800" Width="1024" WindowStartupLocation="CenterScreen">
<local:UserControl1/>
</Window>
<UserControl x:Class="WpfApplication4.UserControl1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
IsEnabled="False" IsHitTestVisible="False">
<Line Name="m_line" Stroke="Black"/>
</UserControl>
public partial class UserControl1 : UserControl
{
public UserControl1()
{
InitializeComponent();
Application.Current.MainWindow.PreviewMouseMove += new MouseEventHandler(MainWindow_PreviewMouseMove);
}
void MainWindow_PreviewMouseMove(object sender, MouseEventArgs e)
{
m_line.X1 = m_line.X2 = Mouse.GetPosition(this).X;
m_line.Y1 = 0;
m_line.Y2 = ActualHeight;
}
protected override void OnRender(DrawingContext drawingContext)
{
base.OnRender(drawingContext);
drawingContext.DrawRectangle(Brushes.Green, null, new Rect(0, 0, ActualWidth, ActualHeight));
Pen p = new Pen(Brushes.Black, 1);
StreamGeometry streamGeometry = new StreamGeometry();
using (StreamGeometryContext geometryContext = streamGeometry.Open())
{
double numPointsMul = 1;
int count = (int)(ActualWidth * numPointsMul);
for (int i = 0; i < count; ++i)
{
double y = ActualHeight / 2 + 20 * Math.Sin(i * 0.1);
if (i == 0)
{
geometryContext.BeginFigure(new Point(i , y), true, true);
}
else
{
geometryContext.LineTo(new Point(i, y), true, true);
}
}
}
drawingContext.DrawGeometry(Brushes.Red, p, streamGeometry);
}
}