Форум программистов, компьютерный форум, киберфорум
C#: WPF, UWP и Silverlight
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/9: Рейтинг темы: голосов - 9, средняя оценка - 4.67
21 / 17 / 1
Регистрация: 01.09.2019
Сообщений: 262

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

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

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

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

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

5
Модератор
Эксперт .NET
 Аватар для Элд Хасп
15959 / 11095 / 2864
Регистрация: 21.04.2018
Сообщений: 32,588
Записей в блоге: 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
 Аватар для Элд Хасп
15959 / 11095 / 2864
Регистрация: 21.04.2018
Сообщений: 32,588
Записей в блоге: 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
 Аватар для Элд Хасп
15959 / 11095 / 2864
Регистрация: 21.04.2018
Сообщений: 32,588
Записей в блоге: 2
05.01.2021, 00:05
Цитата Сообщение от Ахромчон Посмотреть сообщение
Я удалил margin и вроде бы проблема решилась, но с margin она там.
Возможно - я не обратил внимание на маргин.
Вам при считывании размера надо определять не место выделенное под UserControl, а место выделенное под Polygon.

И ещё раз пишу, здесь не конкурс телепатов, а технический Форум.
Выкладывайте код в минимальном виде, но достаточном для его запуска и демонстрации проблемы..
Может быть миллион причин и совершенно не в том месте где вы предполагаете.
1
Модератор
Эксперт .NET
 Аватар для Элд Хасп
15959 / 11095 / 2864
Регистрация: 21.04.2018
Сообщений: 32,588
Записей в блоге: 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
Ответ Создать тему
Новые блоги и статьи
Миграция монолита в Event-Driven микросервисную архитектуру на C#
stackOverflow 11.04.2025
Монолитная архитектура – классический подход к разработке программного обеспечения. Это приложение, построенное как единое целое, где все компоненты тесно связаны между собой. Большинство проектов. . .
Go в Kubernetes: Управление ресурсами
golander 11.04.2025
Разработчики Go-приложений в Kubernetes часто сталкиваются с неожиданными проблемами производительности и даже внезапными отказами контейнеров. Причина этого кроется в особенностях взаимодействия. . .
Агрегаты и сущности в DDD микросервисах
Javaican 10.04.2025
Разработка современных программных систем часто приводит на распутье: монолит или микросервисы? Даже при выборе микросервисной архитектуры многие команды сталкиваются с проблемой правильного. . .
Многопоточность в C#: Task и параллельное программирование
UnmanagedCoder 10.04.2025
Современные процессоры уже давно перестали наращивать тактовую частоту в пользу увеличения количества ядер. Это создало интересную ситуацию: разработчики, привыкшие к последовательному. . .
Линейное решение нелинейной задачи будет иметь приблизительный результат вычисления для метода обработки данных из double buffering.
Hrethgir 10.04.2025
Вообще изначально я пренебрёг квадратурой числа, но потом понял, что для вычисления приблизительного значения - сгодится, формулу можно будет корректировать по ходу. Это потому что прямое соотношение. . .
Переменные в Python
py-thonny 10.04.2025
Переменная в программировании — это символическое имя, связанное с областью памяти, в которой хранится значение. Она позволяет получать доступ к данным через понятные человеку идентификаторы, а не. . .
Многопоточность в C#: Task и асинхронные операции
UnmanagedCoder 10.04.2025
Многопоточность позволяет выполнять несколько операций одновременно, что важно для решения двух основных задач: повышения скорости выполнения вычислительно-сложных операций и сохранения отзывчивости. . .
Запуск контейнеров Docker на ARM64
Mr. Docker 09.04.2025
Появление таких решений, как Apple M1/ M2, AWS Graviton, Ampere Altra и Raspberry Pi, сделало использование ARM-систем обыденностью для многих разработчиков и DevOps-инженеров. При этом Docker,. . .
Vue SFC компонент на PHP с Fusion
Jason-Webb 09.04.2025
PHP на сервере и JavaScript на клиенте — классическое сочетание, которое, несмотря на свою эффективность, создает определенный когнитивный диссонанс при разработке. В этом контексте появляются. . .
TypeScript vs JavaScript: Отличия и когда что использовать
Reangularity 09.04.2025
JavaScript появился в 1995 году как творение Брендана Эйха и быстро стал основой интерактивности в вебе. За свою историю он прошел путь от простого языка для манипуляций с DOM до полноценной. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru
Выделить код Копировать код Сохранить код Нормальный размер Увеличенный размер