Кто-нибудь знает, как сохранить соотношение высоты и ширины 1: 1 для UserControl?
Например. если высота > ширина, ширина и высота будут иметь одинаковый размер и наоборот.
Кто-нибудь знает, как сохранить соотношение высоты и ширины 1: 1 для UserControl?
Например. если высота > ширина, ширина и высота будут иметь одинаковый размер и наоборот.
Я не уверен, что это сработает, но если вы зарегистрируете обработчик для SizeChanged
и вставьте туда свой код, сохраняя соотношение сторон 1:1.
Аргумент SizeChangedEventArgs
имеет старый и новый размер. так что вы можете проверить, что изменилось, и соответственно обновить другое.
Возможно, вам потребуется ввести защитную переменную, чтобы не получить каскад событий SizeChanged
в результате обновления Height
или Width
.
Другая альтернатива:
<local:MyControl Width="{Binding ActualHeight, RelativeSource={RelativeSource Self}}"/>
Width
к свойству ActualHeight
. Но ActualHeight
чего? Относительного Источника! И какой относительный источник? (сам! То есть я говорю, что хочу, чтобы моя собственная ширина была равна ActualHeight, рассчитанной для меня системой компоновки. 30.03.2016 Попробуйте использовать ViewBox и установите для свойства Stretch значение Uniform.
я использовал этот код для сохранения соотношения сторон
внутри пользовательского контроля глобально определить 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;
}
}
}
удачи
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;
}
}
может это поможет... ура
SizeChanged
. Исключение: если ваше окноSizeToContent
и его размер затронут,SetWindowPos()
вызывается сразу во время вычислений, поэтому вы, вероятно, что-то увидите. 19.11.2009