WPF пиксельные линии сетки - PullRequest
0 голосов
/ 19 мая 2018

Я пытаюсь нарисовать на холсте сетку, в которой:

  1. Линии всегда имеют толщину в один пиксель
  2. Размер квадратной плитки выражается в пикселях илидругими словами, расстояние между каждой горизонтальной и вертикальной линиями указывается в пикселях и может быть привязано к коду позади, чтобы я мог изменить его во время выполнения.

Это моя первая попытка, но, возможно, я 'используя неправильные элементы управления.

<Canvas  Panel.ZIndex="0"  x:Name="TileCanvas">
    <Grid Panel.ZIndex="5">
        <Rectangle Width="{Binding ElementName=TileCanvas, Path=ActualWidth}" Height="{Binding ElementName=TileCanvas, Path=ActualHeight}" 
            Stroke="Black" StrokeThickness="0"> 

            <Rectangle.Fill>
                <DrawingBrush ViewportUnits="Absolute" TileMode="Tile">
                    <DrawingBrush.Viewport>
                        <MultiBinding Converter="{StaticResource RectConverter}">
                            <...>
                        </MultiBinding>
                    </DrawingBrush.Viewport>
                    <DrawingBrush.Drawing>
                        <DrawingGroup>
                            <GeometryDrawing Geometry="M0,0 L1,0 1,0.1, 0,0.1Z" Brush="Green" RenderOptions.BitmapScalingMode="NearestNeighbor"/>
                            <GeometryDrawing Geometry="M0,0 L0,1 0.1,1, 0.1,0Z" Brush="Green" RenderOptions.BitmapScalingMode="NearestNeighbor"/>
                        </DrawingGroup>
                    </DrawingBrush.Drawing>
                    <DrawingBrush.Transform>
                        <ScaleTransform ScaleX="1" ScaleY="1"/>
                    </DrawingBrush.Transform>
                </DrawingBrush>

            </Rectangle.Fill>

        </Rectangle>
    </Grid>

Это решение позволяет мне изменять размер каждой плитки, но:

  1. Я не нашел способа исправить толщину линии.до одного пикселя
  2. Когда я изменяю DrawingBrush.Viewport с помощью конвертера, я увеличиваю плитку (Отлично!), но толщина линий увеличивается (бу).

1 Ответ

0 голосов
/ 15 июня 2018

У меня была очень похожая проблема.Вы можете использовать одну геометрию, и если вы хотите избежать увеличения / уменьшения толщины, вы должны выразить толщину в терминах ширины плитки с отношением, как толщина = 1 / tileWidth.Если вы измените этот размер плитки с помощью элемента управления WPF, вы можете использовать конвертер для соответствующего обновления толщины.

<GeometryDrawing Geometry="M10,0 L10,10 0,10 10,10 10,0Z"  Brush="Green" RenderOptions.BitmapScalingMode="NearestNeighbor"/>
    <GeometryDrawing.Pen>
        <Pen Thickness="{Binding ElementName=[TILE SIZE CONTROL VAL], Converter={StaticResource RatioConverter}}"/>
    </GeometryDrawing.Pen>
</GeometryDrawing>

public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
    return (1 / (double)value);
}
...