2009-11-18 2 views

ответ

7

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

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

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

+0

Я думаю, при изменении размера будет мигать. –

+0

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

-2
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; 
     } 
    } 

может быть, это помогает ... веселит

+1

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

3

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

3

Другой вариант:

<local:MyControl Width="{Binding ActualHeight, RelativeSource={RelativeSource Self}}"/> 
+0

Это отлично работает для меня и кажется самым простым ответом (хотя я действительно не понимаю, что он делает). – brianberns

+1

@brianberns привязывает свойство 'Width' к свойству' ActualHeight'. Но что такое? ActualHeight? Из RelativeSource! И какой относительный источник? (сам! То есть, я говорю, что «я хочу, чтобы моя собственная ширина была тем, что ActualHeight рассчитала для меня система компоновки». – heltonbiker

+0

Спасибо, это имеет смысл. BTW, я нашел проблему с этим решением: если изменяется только ширина главного окна (например, перетаскивая ее правую границу в или из), элемент управления не знает, чтобы изменить размер, потому что его высота не изменилась. – brianberns

0

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

внутри usercontrol глобально определить org_width, org_height, org_rat Io:

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; 

использовать этот код в UserControl в 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; 
    } 
    } 
} 

удачи

Смежные вопросы