powered by simpleCommunicator - 2.0.35     © 2025 Programmizd 02
Форумы / WPF, Silverlight [игнор отключен] [закрыт для гостей] / Программное изменение размеров UserControl
16 сообщений из 16, страница 1 из 1
Программное изменение размеров UserControl
    #39808735
Eld Hasp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Возникла задача по контролю размеров UserControl из него самого.

Вроде, где-то попадалось, что контрол получает сообщение (событие?) о доступном для него месте и потом может обработать эту информацию скорректировав свои размеры.

Сейчас понадобилось - не могу найти!

Или мне это приснилось...?
...
Рейтинг: 0 / 0
Программное изменение размеров UserControl
    #39808745
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Measure вызывается тем, кто хочет его разместить (контейнер)
...
Рейтинг: 0 / 0
Программное изменение размеров UserControl
    #39808859
Eld Hasp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Shocker.ProMeasure вызывается тем, кто хочет его разместить (контейнер)

Похоже я не туда копаю или, вообще, чушью занимаюсь.

Опишу на примере, что хочу сделать. Оцените насколько это реально.

Допустим, есть UserControl у которого есть свойство устанавливающее пропорции высоты и ширины - в действительности эти пропорции получаются от заполнения внутренних элементов.

При использовании надо чтобы эти пропорции сохранялись. То есть, в зависимости от предоставленного места, он растягивается на всю ширину или длину с теми же пропорциями.
В примере эту функцию выполняет метод resize .
Его выполнение вызывается в событии SizeChanged. Но это не рабочий вариант - я сделал так для иллюстрации задачи.

Код: 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.
    public partial class ProportionalUserControl : UserControl
    {
        public ProportionalUserControl()
        {
            SizeChanged += ProportionalUserControl_SizeChanged;
            InitializeComponent();
        }

        private void ProportionalUserControl_SizeChanged(object sender, SizeChangedEventArgs e)
        {
            resize(e.NewSize.Width, e.NewSize.Height);
        }

        /// <summary>Отношение ширины к высоте - Width/Height</summary>
        public double RatioWidthToHeight
        {
            get { return (double)GetValue(RatioWidthToHeightProperty); }
            set { SetValue(RatioWidthToHeightProperty, value); }
        }

        // Using a DependencyProperty as the backing store for RatioWidthToHeight.  This enables animation, styling, binding, etc...
        public static readonly DependencyProperty RatioWidthToHeightProperty =
            DependencyProperty.Register("RatioWidthToHeight", typeof(double), typeof(ProportionalUserControl), new PropertyMetadata(1.0));

        protected void resize(double width, double height)
        {
            if (width > height * RatioWidthToHeight)
            {
                Width = height * RatioWidthToHeight;
                Height = height;
            }
            else
            {
                Width = width;
                Height = width / RatioWidthToHeight;
            }
        }
    }
...
Рейтинг: 0 / 0
Программное изменение размеров UserControl
    #39808873
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Eld HaspДопустим, есть UserControl у которого есть свойство устанавливающее пропорции высоты и ширины - в действительности эти пропорции получаются от заполнения внутренних элементов.Может тебе не юзерконтрол нужен, а своя панель?
...
Рейтинг: 0 / 0
Программное изменение размеров UserControl
    #39808915
Eld Hasp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Shocker.ProEld HaspДопустим, есть UserControl у которого есть свойство устанавливающее пропорции высоты и ширины - в действительности эти пропорции получаются от заполнения внутренних элементов.Может тебе не юзерконтрол нужен, а своя панель?
Нет, там по задаче, именно, адаптивный UserControl нужен.

Я несколько решений перепробовал ViewBox, Размерные группы (SharedSizeGroup), конвертеры - всё не то.
Надо, чтобы вся логика была спрятана внутри UserControl.
...
Рейтинг: 0 / 0
Программное изменение размеров UserControl
    #39808923
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну при желании можно и панель внутри контрола спрятать )
...
Рейтинг: 0 / 0
Программное изменение размеров UserControl
    #39808931
Eld Hasp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Shocker.ProНу при желании можно и панель внутри контрола спрятать )
Такой вариант тоже пробовал
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
[/SRC] [SRC XML]<UserControl x:Class="WPF1903.ProportionalUserControl"
             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:WPF1903"
             mc:Ignorable="d" 
             d:DesignHeight="450" d:DesignWidth="800">
    <Grid x:Name="PART_Grid" Background="AliceBlue">
            
    </Grid>
</UserControl>


Но при использовании - ж...па!
Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
<Window x:Class="WPF1903.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:WPF1903"
        xmlns:lib="clr-namespace:CommLibrary;assembly=CommLibrary"
        mc:Ignorable="d" Focusable="True"
        Title="MainWindow" Height="450" Width="800">
    <StackPanel>
        <Border x:Name="border" Width="400" Height="200" BorderThickness="2" BorderBrush="Coral" Padding="5" Margin="5">
            <local:ProportionalUserControl />
        </Border>
        <TextBox Text="{Binding Width, ElementName=border}"/>
        <TextBox Text="{Binding Height, ElementName=border}"/>
    </StackPanel>
</Window>

Скриншот приложил.
Там видно рамку вокруг - она совсем там где нужно.
То есть да, вложенную панель удаётся правильно масштабировать. Но UserControl имеет совсем другой размер.
Как его сжать до вложенной панели?
...
Рейтинг: 0 / 0
Программное изменение размеров UserControl
    #39808934
Eld Hasp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Что-то накосячил с прошлым сообщением - не так отформатировал и не приложил CB UC.
Код: 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.
    public partial class ProportionalUserControl : UserControl
    {
        public ProportionalUserControl()
        {
            SizeChanged += ProportionalUserControl_SizeChanged;
            InitializeComponent();
            ren
        }

        private void ProportionalUserControl_SizeChanged(object sender, SizeChangedEventArgs e)
        {
            resize(e.NewSize.Width, e.NewSize.Height);
        }

        /// <summary>Отношение ширины к высоте - Width/Height</summary>
        public double RatioWidthToHeight
        {
            get { return (double)GetValue(RatioWidthToHeightProperty); }
            set { SetValue(RatioWidthToHeightProperty, value); }
        }

        // Using a DependencyProperty as the backing store for RatioWidthToHeight.  This enables animation, styling, binding, etc...
        public static readonly DependencyProperty RatioWidthToHeightProperty =
            DependencyProperty.Register("RatioWidthToHeight", typeof(double), typeof(ProportionalUserControl), new PropertyMetadata(1.0));

        protected void resize(double width, double height)
        {
            if (width > height * RatioWidthToHeight)
            {
                PART_Grid.Width = height * RatioWidthToHeight;
                PART_Grid.Height = height;
            }
            else
            {
                PART_Grid.Width = width;
                PART_Grid.Height = width / RatioWidthToHeight;
            }
        }

    }
...
Рейтинг: 0 / 0
Программное изменение размеров UserControl
    #39808936
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Eld HaspЕго выполнение вызывается в событии SizeChangedпогоди-ка. Тебе нужно колдовать с MeasureOverride по идее
...
Рейтинг: 0 / 0
Программное изменение размеров UserControl
    #39808973
Eld Hasp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Shocker.ProEld HaspЕго выполнение вызывается в событии SizeChangedпогоди-ка. Тебе нужно колдовать с MeasureOverride по идееИ это пробовал!
Там тоже только размеры самого контрола, а не его контейнера или допустимого размера.
...
Рейтинг: 0 / 0
Программное изменение размеров UserControl
    #39808974
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Eld HaspТам тоже только размеры самого контрола, а не его контейнера или допустимого размера.а причем тут контейнер, ты же сам сказалEld Haspзадача по контролю размеров UserControl из него самого.я перестаю понимать твою задачу
...
Рейтинг: 0 / 0
Программное изменение размеров UserControl
    #39808977
Eld Hasp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Shocker.ProEld HaspТам тоже только размеры самого контрола, а не его контейнера или допустимого размера.а причем тут контейнер, ты же сам сказалEld Haspзадача по контролю размеров UserControl из него самого.я перестаю понимать твою задачу
Для того чтобы изменить свои размеры контрол же должен получить информацию о выделенном уме пространстве.

Допустим, ему выделена ячейка Grid размерами 400х400, он получает этот размер и устанавливает собственный 400х250.
Каким образом "общаются" контейнер и вложенные элементы о размерах?
...
Рейтинг: 0 / 0
Программное изменение размеров UserControl
    #39808979
Eld Hasp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Может я не правильно использую MeasureOverride ?
Код: 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.
55.
    public partial class ProportionalUserControl : UserControl
    {
        public ProportionalUserControl()
        {
            //SizeChanged += ProportionalUserControl_SizeChanged;
            InitializeComponent();
        }

        private void ProportionalUserControl_SizeChanged(object sender, SizeChangedEventArgs e)
        {
            resize(e.NewSize.Width, e.NewSize.Height);
        }

        /// <summary>Отношение ширины к высоте - Width/Height</summary>
        public double RatioWidthToHeight
        {
            get { return (double)GetValue(RatioWidthToHeightProperty); }
            set { SetValue(RatioWidthToHeightProperty, value); }
        }

        // Using a DependencyProperty as the backing store for RatioWidthToHeight.  This enables animation, styling, binding, etc...
        public static readonly DependencyProperty RatioWidthToHeightProperty =
            DependencyProperty.Register("RatioWidthToHeight", typeof(double), typeof(ProportionalUserControl), new PropertyMetadata(1.0));

        protected void resize(double width, double height)
        {
            if (width > height * RatioWidthToHeight)
            {
                PART_Grid.Width = height * RatioWidthToHeight;
                PART_Grid.Height = height;
            }
            else
            {
                PART_Grid.Width = width;
                PART_Grid.Height = width / RatioWidthToHeight;
            }
        }

        protected override Size MeasureOverride(Size constraint)
        {
            double width, height;
            if (constraint.Width > constraint.Height * RatioWidthToHeight)
            {
                width = constraint.Height * RatioWidthToHeight;
                height = constraint.Height;
            }
            else
            {
                width = constraint.Width;
                height = constraint.Width / RatioWidthToHeight;
            }

            return new Size(width,height);
        }
    }
...
Рейтинг: 0 / 0
Программное изменение размеров UserControl
    #39809020
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Eld HaspКаким образом "общаются" контейнер и вложенные элементы о размерах?Вот как это выглядит со стороны панели
https://www.sql.ru/forum/1308915/wpf-shpargalka-dlya-sozdaniya-paneli
тут подробнее
http://professorweb.ru/my/WPF/Template/level18/18_11.php
Понимая, как работает компоновка со стороны контейнера, ты поймешь, что ему должен вернуть элемент

Eld HaspМожет я не правильно использую MeasureOverride ?В примере ты пытаешься воздействовать и на размеры панели и на размеры контрола. Оставь только MeasureOverride
...
Рейтинг: 0 / 0
Программное изменение размеров UserControl
    #39809259
Eld Hasp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Shocker.ProEld HaspКаким образом "общаются" контейнер и вложенные элементы о размерах?Вот как это выглядит со стороны панели
https://www.sql.ru/forum/1308915/wpf-shpargalka-dlya-sozdaniya-paneli
тут подробнее
http://professorweb.ru/my/WPF/Template/level18/18_11.php
Понимая, как работает компоновка со стороны контейнера, ты поймешь, что ему должен вернуть элемент

professorweb читал и пытался делать по нему - не вышло.

Вашу тему прочитаю - постараюсь понять.

Shocker.ProEld HaspМожет я не правильно использую MeasureOverride ?В примере ты пытаешься воздействовать и на размеры панели и на размеры контрола. Оставь только MeasureOverride
Нет. Там только MeasureOverride используется. Вызов метода resize не происходит - подключение обработчика SizeChanged в конструкторе UserControl закомментировано.

Вот код с удалением нерабочих участков. Я с него начинал свои попытки.
Код: 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.
    public partial class ProportionalUserControl : UserControl
    {
        public ProportionalUserControl()
        {
            InitializeComponent();
        }

        public double RatioWidthToHeight
        {
            get { return (double)GetValue(RatioWidthToHeightProperty); }
            set { SetValue(RatioWidthToHeightProperty, value); }
        }

        // Using a DependencyProperty as the backing store for RatioWidthToHeight.  This enables animation, styling, binding, etc...
        public static readonly DependencyProperty RatioWidthToHeightProperty =
            DependencyProperty.Register("RatioWidthToHeight", typeof(double), typeof(ProportionalUserControl), new PropertyMetadata(1.5));

        protected override Size MeasureOverride(Size constraint)
        {
            double width, height;
            if (constraint.Width > constraint.Height * RatioWidthToHeight)
            {
                width = constraint.Height * RatioWidthToHeight;
                height = constraint.Height;
            }
            else
            {
                width = constraint.Width;
                height = constraint.Width / RatioWidthToHeight;
            }

            return new Size(width, height);
        }
...
Рейтинг: 0 / 0
Программное изменение размеров UserControl
    #39809267
Eld Hasp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Блин!
Ну, я тупой....! (((
Всё работает. Я затупил с использованием!
Сам UserControl и внешний Border (который рамку делает вокруг UserControl) надо же сжимать до его размеров, а не растягивать до размеров контейнера!

Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
    <StackPanel>
        <Border x:Name="border" Width="400" Height="200"
                Padding="5" Margin="5" BorderThickness="2" BorderBrush="LightGreen" >
            <Border BorderThickness="2" BorderBrush="Coral" VerticalAlignment="Center" HorizontalAlignment="Center" >
                <local:ProportionalUserControl VerticalAlignment="Center" HorizontalAlignment="Center" />
            </Border>
        </Border>
        <TextBox Text="{Binding Width, ElementName=border}"/>
        <TextBox Text="{Binding Height, ElementName=border}"/>
    </StackPanel>



Зла на себя не хватает! Два дня провозился из-за своей глупости!

Shocker.Pro, ОГРОМНОЕ СПАСИБО за Ваше внимание. И не обессудьте за мою тупость.
...
Рейтинг: 0 / 0
16 сообщений из 16, страница 1 из 1
Форумы / WPF, Silverlight [игнор отключен] [закрыт для гостей] / Программное изменение размеров UserControl
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]