Визуализированные прямоугольники, отсутствующие в огромном элементе управления WPF

#c# #wpf #wpf-controls #drawingcontext

#c# #wpf #wpf-элементы управления #drawingcontext

Вопрос:

Мне нужен WPF Control с 300000000 Width и Height , на котором я буду рисовать Rectangles , на основе некоторого ввода. Я рисую Rectangle на OnRender элементе управления. Для целей тестирования я поместил элемент управления внутри a ScrollViewer и рисую Rectangles на каждом пикселе от (0,0) до (1000,1000). Если Width amp; Height равно 1000000, Rectangles они отображаются правильно, как показано ниже ( Rectangles отображаются на всех пикселях от (0,0) до (1000,1000), так что это выглядит как on в приведенной ниже ссылке)

https://social.msdn.microsoft.com/Forums/getfile/950012

Но если я увеличу размер до 3000000, на чертеже не будет нескольких строк, как показано ниже, https://social.msdn.microsoft.com/Forums/getfile/950018

Мой Xaml:

 <ScrollViewer x:Name="MainScrollViewer"
              Grid.Row="2"
              Grid.ColumnSpan="2"
              HorizontalScrollBarVisibility="Auto"
              VerticalScrollBarVisibility="Auto">
  <waferControl:WaferMapControl x:Name="WaferControl"
                                Grid.Row="2"
                                Grid.ColumnSpan="2"
                                Width="30000000"
                                Height="30000000"
                                Margin="10"
                                ColumnCount="{Binding WaferInfo.ColumnCount}"
                                RowCount="{Binding WaferInfo.RowCount}"
                                SelectedCells="{Binding SelectedCellCollection}"
                                Visibility="Collapsed" />
</ScrollViewer>
  

Я использую следующий код в OnRender of WaferMapControl .

 private void RenderBackgroud(IEnumerable lists`enter code here`)
{
    using (DrawingContext dc = _backgroundDv.RenderOpen())
    {
        SolidColorBrush brush = Brushes.Black;

        if (brush.CanFreeze)
            brush.Freeze();

        foreach (GridCellInfo cellInfo in lists)
        {
            double length = cellInfo.GridRange;

            var point = new Point(
                cellInfo.RowIndex   1,
                ActualHeight - cellInfo.ColumnIndex  - length);

            RenderBackgroud(dc, point, brush, length);
        }
    }
}

private void RenderBackgroud(DrawingContext dc, Point point, Brush brush, double length)
{
   var rect = new Rect(point, new Size(length, length));

   dc.DrawRectangle(brush, null, rect);
} 
  

cellInfo Содержит координаты x, y. Вычисление точки выполняется для рисования снизу слева. В моем примере длина равна 1.

Может кто-нибудь мне помочь, в чем проблема. Дайте мне знать, если вам что-нибудь потребуется с моей стороны.

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

1. у вас есть полный воспроизводящий код?

2. тогда, пожалуйста, поделитесь этим

3. Возможно, это вызвано сглаживанием. Попробуйте отключить его (что-то вроде this.SetValue(RenderOptions.EdgeModeProperty, EdgeMode.Aliased) перед циклом для рисования прямоугольников)

4. @MatthewWatson не работает. все то же самое.

5. @SimonMourier вы можете загрузить код отсюда