WedX - журнал о программировании и компьютерных науках

Как сохранить соотношение сторон UserControl?

Кто-нибудь знает, как сохранить соотношение высоты и ширины 1: 1 для UserControl?

Например. если высота > ширина, ширина и высота будут иметь одинаковый размер и наоборот.


Ответы:


1

Я не уверен, что это сработает, но если вы зарегистрируете обработчик для SizeChanged и вставьте туда свой код, сохраняя соотношение сторон 1:1.

Аргумент SizeChangedEventArgs имеет старый и новый размер. так что вы можете проверить, что изменилось, и соответственно обновить другое.

Возможно, вам потребуется ввести защитную переменную, чтобы не получить каскад событий SizeChanged в результате обновления Height или Width.

18.11.2009
  • Я думаю, что элемент управления будет мигать при изменении размера. 18.11.2009
  • Он не будет мигать, потому что WPF использует сохраненный режим, а рендеринг выполняется с более низким приоритетом, поэтому рендеринг будет видеть окончательный результат всех событий SizeChanged. Исключение: если ваше окно SizeToContent и его размер затронут, SetWindowPos() вызывается сразу во время вычислений, поэтому вы, вероятно, что-то увидите. 19.11.2009

  • 2

    Другая альтернатива:

    <local:MyControl Width="{Binding ActualHeight, RelativeSource={RelativeSource Self}}"/>
    
    29.01.2015
  • Это отлично работает для меня и кажется самым простым ответом (хотя я действительно не понимаю, что он делает). 30.03.2016
  • @brianberns привязывает свойство Width к свойству ActualHeight. Но ActualHeight чего? Относительного Источника! И какой относительный источник? (сам! То есть я говорю, что хочу, чтобы моя собственная ширина была равна ActualHeight, рассчитанной для меня системой компоновки. 30.03.2016
  • Спасибо, это имеет смысл. Кстати, я обнаружил проблему с этим решением: если изменяется только ширина главного окна (например, путем перетаскивания его правой границы внутрь или наружу), элемент управления не знает об изменении размера, потому что его высота не изменилась. 31.03.2016

  • 3

    Попробуйте использовать ViewBox и установите для свойства Stretch значение Uniform.

    08.05.2011

    4

    я использовал этот код для сохранения соотношения сторон

    внутри пользовательского контроля глобально определить org_width, org_height, org_ratio:

    private static double org_width = 77.6;//desired width
    private static double org_height = 81.4;//desired height
    
    private static double org_ratio = org_width / org_height;
    

    используйте этот код внутри пользовательского контроля в событии SizeChanged:

    FrameworkElement UCborder = this;
    UCborder.Width = UCborder.Height*org_ratio;
    

    и, наконец, ваш пользовательский код управления должен выглядеть так:

    using System.Windows;
    using System.Windows.Controls;
    using System.Windows.Input;
    using System.Windows.Media;
    
    namespace yournamespace
    {
        public partial class YourUserControl : UserControl
        {
    
          private static double org_width = 77.6;//desired width
          private static double org_height = 81.4;//desired height
    
         private static double org_ratio = org_width / org_height; // width/height
    
    
    
         public YourUserControl()
         {
             InitializeComponent();
         }
    
    
         private void UserControl_SizeChanged(object sender, SizeChangedEventArgs e)
         {
              FrameworkElement UCborder = this;
              UCborder.Width = UCborder.Height*org_ratio;
         }
      }
    }
    

    удачи

    11.03.2015

    5
    private bool isSizeChangeDefered;
    
     private void uiElement_SizeChanged(object sender, SizeChangedEventArgs e)
        {
             //Keep Acpect Ratio
            const double factor = 1.8;
            if(isSizeChangeDefered)
                return;
    
            isSizeChangeDefered = true;
            try
            {
                if (e.WidthChanged)
                {
                    driverPan.Height = e.NewSize.Width * factor; 
                }
                if (e.HeightChanged)
                {
                    driverPan.Height = e.NewSize.Width / factor; 
                }
            }
            finally
            {
            //    e.Handled = true;
                isSizeChangeDefered = false;
            }
        }
    

    может это поможет... ура

    05.05.2011
  • Этот ответ в основном является примером ответа, предоставленного ChrisF 18 месяцев назад. Это также кажется неполным (что такое переменная driverPan?), и я считаю, что у нее есть логическая проблема, если высота и ширина изменяются в одном и том же событии (изменение размера диагонали) 06.05.2011
  • Новые материалы

    Объяснение документов 02: BERT
    BERT представил двухступенчатую структуру обучения: предварительное обучение и тонкая настройка. Во время предварительного обучения модель обучается на неразмеченных данных с помощью..

    Как проанализировать работу вашего классификатора?
    Не всегда просто знать, какие показатели использовать С развитием глубокого обучения все больше и больше людей учатся обучать свой первый классификатор. Но как только вы закончите..

    Работа с цепями Маркова, часть 4 (Машинное обучение)
    Нелинейные цепи Маркова с агрегатором и их приложения (arXiv) Автор : Бар Лайт Аннотация: Изучаются свойства подкласса случайных процессов, называемых дискретными нелинейными цепями Маркова..

    Crazy Laravel Livewire упростил мне создание электронной коммерции (панель администратора и API) [Часть 3]
    Как вы сегодня, ребята? В этой части мы создадим CRUD для данных о продукте. Думаю, в этой части я не буду слишком много делиться теорией, но чаще буду делиться своим кодом. Потому что..

    Использование машинного обучения и Python для классификации 1000 сезонов новичков MLB Hitter
    Чему может научиться машина, глядя на сезоны новичков 1000 игроков MLB? Это то, что исследует это приложение. В этом процессе мы будем использовать неконтролируемое обучение, чтобы..

    Учебные заметки: создание моего первого пакета Node.js
    Это мои обучающие заметки, когда я научился создавать свой самый первый пакет Node.js, распространяемый через npm. Оглавление Глоссарий I. Новый пакет 1.1 советы по инициализации..

    Забудьте о Matplotlib: улучшите визуализацию данных с помощью умопомрачительных функций Seaborn!
    Примечание. Эта запись в блоге предполагает базовое знакомство с Python и концепциями анализа данных. Привет, энтузиасты данных! Добро пожаловать в мой блог, где я расскажу о невероятных..


    Для любых предложений по сайту: [email protected]