21 / 17 / 1
Регистрация: 01.09.2019
Сообщений: 262
1

Объект вырисовывается не совсем по центру

28.12.2020, 19:50. Показов 1611. Ответов 5
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Всем привет,
полигон рисуется не точно по центру. Кто-нибудь может поправить код?

XML
1
2
3
4
5
6
7
8
9
10
11
12
13
    <Grid>
        <Grid
            x:Name="PART_Grid"
            Margin="2"
            SizeChanged="PART_Grid_SizeChanged">
 
            <Polygon
                Points="{Binding Points, Mode=OneWay, ElementName=PART_polygone}"
                Stroke="Black"
                StrokeThickness="{Binding StrokeThickness, Mode=OneWay, ElementName=PART_polygone}">               
            </Polygon>
        </Grid>
    </Grid>



C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
public delegate PointCollection InscribedPolygonHandler(double width, double height);
 
public InscribedPolygonHandler InscribedPolygonDelegate
        {
            get { return (InscribedPolygonHandler)GetValue(InscribedPolygonDelegateProperty); }
            set { SetValue(InscribedPolygonDelegateProperty, value); }
        }
 
        // Using a DependencyProperty as the backing store for InscribedPolygonDelegate.  This enables animation, styling, binding, etc...
        public static readonly DependencyProperty InscribedPolygonDelegateProperty =
            DependencyProperty.Register("InscribedPolygonDelegate", typeof(InscribedPolygonHandler), typeof(Flap_isOpened_feedback), new PropertyMetadata((InscribedPolygonHandler)InscribedPolygonMetod));
 
 
 
        protected static readonly DependencyPropertyKey PointsKey =
            DependencyProperty.RegisterReadOnly(nameof(Points), typeof(PointCollection), typeof(Polygone_test), new PropertyMetadata(null));
 
        public PointCollection Points
        {
            get { return (PointCollection)GetValue(PointsProperty); }
            protected set { SetValue(PointsKey, value); }
        }
 
        
        public static readonly DependencyProperty PointsProperty = PointsKey.DependencyProperty;
       
      
        static protected PointCollection InscribedPolygonMetod(double width, double height)
            => new PointCollection(new Point[] { new Point(0, 0), new Point(width, 0), new Point(0.5 * width, height) });
 
 
        
        private void PART_Grid_SizeChanged(object sender, SizeChangedEventArgs e)
           => Points = new PointCollection
           (
               InscribedPolygonDelegate?.Invoke(e.NewSize.Width - StrokeThickness, e.NewSize.Height - StrokeThickness)
               .Select(pnt => new Point(pnt.X + StrokeThickness * 0.5 , pnt.Y + StrokeThickness * 0.5 )));
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
28.12.2020, 19:50
Ответы с готовыми решениями:

DataGridView не вырисовывается
Уважаемые мастера кода, прошу вас помочь. Ситуация следующая: в программе формируется...

Объект по центру
Постоянно показывает фотографии не по центру а с левой стороны. Как сделать чтобы все было по...

Направить объект в к центру экрана
Здравствуйте! Помогите пожалуйста решить задачку: Есть звездолет с пусковой установкой для торпед...

Как сделать так, чтобы объект всегда позиционировался идеально по центру экрана?
Как сделать так, чтобы объект всегда позиционировался идеально по центру экрана

5
Модератор
Эксперт .NET
15456 / 10703 / 2784
Регистрация: 21.04.2018
Сообщений: 31,517
Записей в блоге: 2
31.12.2020, 17:51 2
Цитата Сообщение от Ахромчон Посмотреть сообщение
Кто-нибудь может поправить код?
Это у вас Окно, UserControl или Custom Control?

Добавлено через 3 минуты
Цитата Сообщение от Ахромчон Посмотреть сообщение
C#
9
10
11
12
13
        // Using a DependencyProperty as the backing store for InscribedPolygonDelegate.  This enables animation, styling, binding, etc...
        public static readonly DependencyProperty InscribedPolygonDelegateProperty =
            DependencyProperty.Register("InscribedPolygonDelegate", typeof(InscribedPolygonHandler), typeof(Flap_isOpened_feedback), new PropertyMetadata((InscribedPolygonHandler)InscribedPolygonMetod));
protected static readonly DependencyPropertyKey PointsKey =
            DependencyProperty.RegisterReadOnly(nameof(Points), typeof(PointCollection), typeof(Polygone_test), new PropertyMetadata(null));
Странная какая-то регистрация свойств.
Одно регистрируется в типе Flap_isOpened_feedback, второе - в Polygone_test.
Это случайная ошибка или намерено так сделано?
0
Модератор
Эксперт .NET
15456 / 10703 / 2784
Регистрация: 21.04.2018
Сообщений: 31,517
Записей в блоге: 2
31.12.2020, 18:27 3
Лучший ответ Сообщение было отмечено Ахромчон как решение

Решение

Ахромчон, и просьба: когда просите помощи с проблемой в конкретном коде, выкладывайте его в таком виде, чтобы можно было его скопировать или загрузить и потом запустить.
Так как ошибка может быть совсем не в том месте кода, которого вы частично выложили.
В данном случае я воссоздал (насколько понял) ваш код, но не увидел в нём каких-то проблем с центрированием:

Есть проблемы с учётом толщины линии - при большой толщине обрезаются углы и верхняя сторона.

Коды на которых проверял:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
using System.Windows;
using System.Windows.Controls;
using System.Windows.Media;
 
namespace PolygoneTest
{
    public class BasePolygoneTestUC : UserControl
    {
        public delegate PointCollection InscribedPolygonHandler(double width, double height);
 
        public InscribedPolygonHandler InscribedPolygonDelegate
        {
            get { return (InscribedPolygonHandler)GetValue(InscribedPolygonDelegateProperty); }
            set { SetValue(InscribedPolygonDelegateProperty, value); }
        }
 
        // Using a DependencyProperty as the backing store for InscribedPolygonDelegate.  This enables animation, styling, binding, etc...
        public static readonly DependencyProperty InscribedPolygonDelegateProperty =
            DependencyProperty.Register("InscribedPolygonDelegate", typeof(InscribedPolygonHandler), typeof(BasePolygoneTestUC), new PropertyMetadata((InscribedPolygonHandler)InscribedPolygonMetod));
 
 
 
        protected static readonly DependencyPropertyKey PointsKey =
            DependencyProperty.RegisterReadOnly(nameof(Points), typeof(PointCollection), typeof(BasePolygoneTestUC), new PropertyMetadata(null));
 
        public PointCollection Points
        {
            get { return (PointCollection)GetValue(PointsProperty); }
            protected set { SetValue(PointsKey, value); }
        }
 
 
        public static readonly DependencyProperty PointsProperty = PointsKey.DependencyProperty;
 
 
        static protected PointCollection InscribedPolygonMetod(double width, double height)
            => new PointCollection(new Point[] { new Point(0, 0), new Point(width, 0), new Point(0.5 * width, height) });
 
 
 
 
        public double StrokeThickness
        {
            get { return (double)GetValue(StrokeThicknessProperty); }
            set { SetValue(StrokeThicknessProperty, value); }
        }
 
        // Using a DependencyProperty as the backing store for StrokeThickness.  This enables animation, styling, binding, etc...
        public static readonly DependencyProperty StrokeThicknessProperty =
            DependencyProperty.Register(nameof(StrokeThickness), typeof(double), typeof(BasePolygoneTestUC), new PropertyMetadata(1.0));
 
 
    }
}
XML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<local:BasePolygoneTestUC x:Class="PolygoneTest.PolygoneTestUC"
                          x:Name="PART_polygone"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
             xmlns:local="clr-namespace:PolygoneTest"
             mc:Ignorable="d" 
             d:DesignHeight="450" d:DesignWidth="800">
    <Grid>
        <Grid
            x:Name="PART_Grid"
            Margin="2"
            SizeChanged="PART_Grid_SizeChanged">
 
            <Polygon
                Points="{Binding Points, Mode=OneWay, ElementName=PART_polygone}"
                Stroke="Black"
                StrokeThickness="{Binding StrokeThickness, Mode=OneWay, ElementName=PART_polygone}">
            </Polygon>
        </Grid>
    </Grid>
</local:BasePolygoneTestUC>
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
using System.Linq;
using System.Windows;
using System.Windows.Media;
 
namespace PolygoneTest
{
    /// <summary>
    /// Логика взаимодействия для PolygoneTestUC.xaml
    /// </summary>
    public partial class PolygoneTestUC : BasePolygoneTestUC
    {
        public PolygoneTestUC()
        {
            InitializeComponent();
        }
        private void PART_Grid_SizeChanged(object sender, SizeChangedEventArgs e)
          => Points = new PointCollection
          (
              InscribedPolygonDelegate?.Invoke(e.NewSize.Width - StrokeThickness, e.NewSize.Height - StrokeThickness)
              .Select(pnt => new Point(pnt.X + StrokeThickness * 0.5, pnt.Y + StrokeThickness * 0.5)));
    }
}
На всякий случай, архив с исходниками: PolygoneTest.7z
2
21 / 17 / 1
Регистрация: 01.09.2019
Сообщений: 262
04.01.2021, 19:25  [ТС] 4
Элд Хасп, спасибо за труд!

Я удалил margin и вроде бы проблема решилась, но с margin она там.
0
Модератор
Эксперт .NET
15456 / 10703 / 2784
Регистрация: 21.04.2018
Сообщений: 31,517
Записей в блоге: 2
05.01.2021, 00:05 5
Цитата Сообщение от Ахромчон Посмотреть сообщение
Я удалил margin и вроде бы проблема решилась, но с margin она там.
Возможно - я не обратил внимание на маргин.
Вам при считывании размера надо определять не место выделенное под UserControl, а место выделенное под Polygon.

И ещё раз пишу, здесь не конкурс телепатов, а технический Форум.
Выкладывайте код в минимальном виде, но достаточном для его запуска и демонстрации проблемы..
Может быть миллион причин и совершенно не в том месте где вы предполагаете.
1
Модератор
Эксперт .NET
15456 / 10703 / 2784
Регистрация: 21.04.2018
Сообщений: 31,517
Записей в блоге: 2
06.01.2021, 00:45 6
Ахромчон, убрал все огрехи которые смог выявить:
XML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
<local:BasePolygoneTestUC x:Class="PolygoneTest.PolygoneTestUC"
                          x:Name="PART_Main"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
             xmlns:local="clr-namespace:PolygoneTest"
             mc:Ignorable="d" 
             d:DesignHeight="450" d:DesignWidth="800">
    <Grid x:Name="PART_Grid"
          Margin="20"
          Background="LightPink">
        <Canvas x:Name="PART_Canvas"
                SizeChanged="OnSizeChanged"
                Background="LightGreen"
                ClipToBounds="False">
 
            <Polygon x:Name="PART_Polygon"
                 Points="{Binding Points, Mode=OneWay, ElementName=PART_Main}"
                 Stroke="Black" StrokeThickness="{Binding StrokeThickness, ElementName=PART_Main}">
            </Polygon>
        </Canvas>
    </Grid>
</local:BasePolygoneTestUC>
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
using System.Windows;
 
namespace PolygoneTest
{
    /// <summary>
    /// Логика взаимодействия для PolygoneTestUC.xaml
    /// </summary>
    public partial class PolygoneTestUC : BasePolygoneTestUC
    {
        public PolygoneTestUC()
        {
            InitializeComponent();
        }
 
        protected override void OnPropertyChanged(DependencyPropertyChangedEventArgs e)
        {
            base.OnPropertyChanged(e);
 
            if (e.Property == StrokeThicknessProperty)
                PART_Canvas.Margin = new Thickness((double)e.NewValue / 2);
        }
        private void OnSizeChanged(object sender, SizeChangedEventArgs e)
        {
            if (InscribedPolygonDelegate == null)
                return;
            if (!(sender is FrameworkElement element))
                return;
 
            Points = InscribedPolygonDelegate?.Invoke(e.NewSize.Width, e.NewSize.Height);
        }
    }
}
1
06.01.2021, 00:45
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
06.01.2021, 00:45
Помогаю со студенческими работами здесь

Как выводить Application.MessageBox по-центру приложения, а не по-центру экрана
сабж. на stackoverflow нашел вариант, как показывать это сообщение по центру приложения для...

Блок не стоит по центру, как сделать по центру
Всем привет, помогите нубу) Сайт получается http://1a-med.ru/ Я не как не могу сделать, чтобы...

Как выровнить резиновыь сайт по центру сайт по центру?
Здравствуйте. Как можно этот резиновый сайт выравнять по центру, чтобы при уменшении размера в...

Как в книгу excel (ole объект) добавить картинку (т.е. объект image)
Создал книгу excel ExcelApp := CreateOleObject('Excel.Application'); ...

Может ли объект-член, или объект-элемент достучаться к содержащему его?
Предположим, class A { ... }; class B { .... A a; ... };

XML - объект не вмещается в другой объект, но его должно быть видно
Есть разметка: &lt;FrameLayout ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru