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

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

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

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

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)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
28.12.2020, 19:50
Ответы с готовыми решениями:

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

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

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

5
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16150 / 11271 / 2890
Регистрация: 21.04.2018
Сообщений: 33,142
Записей в блоге: 2
31.12.2020, 17:51
Цитата Сообщение от Ахромчон Посмотреть сообщение
Кто-нибудь может поправить код?
Это у вас Окно, 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
 Аватар для Элд Хасп
16150 / 11271 / 2890
Регистрация: 21.04.2018
Сообщений: 33,142
Записей в блоге: 2
31.12.2020, 18:27
Лучший ответ Сообщение было отмечено Ахромчон как решение

Решение

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

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

Коды на которых проверял:
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  [ТС]
Элд Хасп, спасибо за труд!

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

И ещё раз пишу, здесь не конкурс телепатов, а технический Форум.
Выкладывайте код в минимальном виде, но достаточном для его запуска и демонстрации проблемы..
Может быть миллион причин и совершенно не в том месте где вы предполагаете.
1
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16150 / 11271 / 2890
Регистрация: 21.04.2018
Сообщений: 33,142
Записей в блоге: 2
06.01.2021, 00:45
Ахромчон, убрал все огрехи которые смог выявить:
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
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
06.01.2021, 00:45
Помогаю со студенческими работами здесь

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

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

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

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

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


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

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

Новые блоги и статьи
Памятка для бота и "визитка" для читателей "Semantic Universe Layer (Слой семантической вселенной)"
Hrethgir 19.04.2026
Сгенерировано для краткого описания по случаю сборки и компиляции скелета серверного приложения. И пусть после этого скажут, что статьи сгенерированные AI - туфта и не интересно. И это не реклама -. . .
Запрет удаления строк ТЧ документа при определенном условии
Maks 19.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "Аккумуляторы", разработанного в конфигурации КА2. У данного документа есть ТЧ, в которой в зависимости от прав доступа. . .
Модель заражения группы наркоманов
alhaos 17.04.2026
Условия задачи сформулированы тут Суть: - Группа наркоманов из 10 человек. - Только один инфицирован ВИЧ. - Колются одной иглой. - Колются раз в день. - Колются последовательно через. . .
Мысли в слух. Про "навсегда".
kumehtar 16.04.2026
Подумалось тут, что наверное очень глупо использовать во всяких своих установках понятие "навсегда". Это очень сильное понятие, и я только начинаю понимать край его смысла, не смотря на то что давно. . .
My Business CRM
MaGz GoLd 16.04.2026
Всем привет, недавно возникла потребность создать CRM, для личных нужд. Собственно программа предоставляет из себя базу данных клиентов, в которой можно фиксировать звонки, стадии сделки, а также. . .
Знаешь почему 90% людей редко бывают счастливыми?
kumehtar 14.04.2026
Потому что они ждут. Ждут выходных, ждут отпуска, ждут удачного момента. . . а удачный момент так и не приходит.
Фиксация колонок в отчете СКД
Maks 14.04.2026
Фиксация колонок в СКД отчета типа Таблица. Задача: зафиксировать три левых колонки в отчете. Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка) / / . . .
Настройки VS Code
Loafer 13.04.2026
{ "cmake. configureOnOpen": false, "diffEditor. ignoreTrimWhitespace": true, "editor. guides. bracketPairs": "active", "extensions. ignoreRecommendations": true, . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru