Рисование формы WPF в виде Rectangle: StrokeThickness делится пополам, если Stroke является прозрачным - PullRequest
0 голосов
/ 16 апреля 2019

проблема: у меня есть немного UCControl, чем дизайн геометрических фигур. Я могу настроить во время выполнения, размеры (размер и толщину обводки), цвета (фон и обводка) и все работает нормально, пока я не буду использовать сплошные цвета. Проблемы возникли, если я использую, для обводки, Прозрачную кисть: форма отображается с правильными размерами и цветами, но штрихованность вдвое меньше.

<Grid x:Name="_grid" >
    <Grid.ColumnDefinitions>
        <ColumnDefinition Width="*" />
    </Grid.ColumnDefinitions>
    <Grid.RowDefinitions>
        <RowDefinition Height="*" />
    </Grid.RowDefinitions>

    <Rectangle Grid.Row="0" Grid.Column="0" Margin="0,0,0,0"
        Width="{Binding ActualWidth, ElementName=_grid}"
        Height="{Binding ActualHeight, ElementName=_grid}" 
        Stroke="{Binding Rectangle.BorderColorBrush}"
        StrokeThickness="{Binding Rectangle.Thick}" 
        Fill="{Binding Rectangle.BackgroundBrush}"/>

</Grid>

Мне нужно, чтобы, если обводка была сплошным или прозрачным, толщина обводки была одинаковой. На данный момент я обнаружил, что это: коричневый цвет фона, черный или прозрачный штрих. StrokeThickness равно 20 для обоих (см. Точечную сетку: удаленный 10) render

Ответы [ 2 ]

1 голос
/ 16 апреля 2019

StrokeThickness элемента Rectangle или Ellipse влияет на его общую ширину и высоту, в то время как фактический контур базовой геометрии лежит в центре штриха. Это становится очевидным, когда вы используете пунктирный штрих, такой как

<Rectangle Width="100" Height="100" Fill="Red" Stroke="Black"
           StrokeThickness="10" StrokeDashArray="1 1"/>

В результате получается:

enter image description here

Размер заполненной области составляет всего 90 х 90.

Для заполненной области, которая точно соответствует нужному размеру, используйте Path с RectangleGeometry:

<Path Fill="Red" Stroke="Black" StrokeThickness="10" StrokeDashArray="1 1">
    <Path.Data>
        <RectangleGeometry Rect="0,0,100,100"/>
    </Path.Data>
</Path>

Результат:

enter image description here

0 голосов
/ 17 апреля 2019

В данном конкретном случае мне нужно использовать StrokeThickness в качестве границы вокруг фигуры, если мне нужен размер границы 20, мне нужна вся форма вокруг границы 20, не имеет значения, является ли цвет сплошным цветом, илиПрозрачный, а общий размер фигуры (рамка + фон) не должен изменяться.Итак, учитывая, как рисуется обводка (она создает внутреннее смещение фигуры для половины StrokeThickness и рисует половину обводки внутри и половину обводки за пределами этого смещения), мне просто нужно продублировать StrokeThickness, если цвет обводки прозрачный.Да, это немного сбивает с толку, я надеюсь, что это будет понятно и полезно в любом случае ... здесь код только для элемента Rectangle.StrokeThickness:

<Rectangle.StrokeThickness>
    <MultiBinding Converter="{StaticResource MyConverter}">
        <Binding Path="Rectangle.Thick"></Binding>
        <Binding Path="Rectangle.BorderColorBrush"></Binding>
    </MultiBinding>
</Rectangle.StrokeThickness>

.. и преобразователь просто дублирует значение Rectangle.Thick if (Rectangle.BorderColorBrush == Brushes.Transparent).конечный результат - это то, что я хотел:

final draw

...