#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 вы можете загрузить код отсюда