У кого-нибудь есть идея, как сохранить соотношение высоты и ширины 1: 1 от UserControl?Как сохранить пропорции UserControl?
E.g. если Высота> Ширина, Ширина & Высота будет иметь тот же размер и наоборот.
У кого-нибудь есть идея, как сохранить соотношение высоты и ширины 1: 1 от UserControl?Как сохранить пропорции UserControl?
E.g. если Высота> Ширина, Ширина & Высота будет иметь тот же размер и наоборот.
Я не уверен, что это сработает, но если вы зарегистрируете обработчик для события SizeChanged
, и там, там, в вашем коде сохраняйте соотношение сторон 1: 1.
Аргумент SizeChangedEventArgs
имеет старый размер и новый размер, поэтому вы можете проверить, что изменилось и соответствующим образом обновить.
Возможно, вам понадобится ввести защитную переменную, чтобы вы не получили каскад SizeChanged
событий в результате обновления Height
или Width
.
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;
}
}
может быть, это помогает ... веселит
Этот ответ в основном является примером ответа, предоставленного ChrisF 18 месяцев назад. Это также кажется неполным (что такое переменная driverPan?), И я считаю, что он имеет логическую проблему, если в одном и том же событии изменяются как высота, так и ширина (изменение размера) –
Попробуйте использовать ViewBox и установив его свойство Stretch для равномерной
Другой вариант:
<local:MyControl Width="{Binding ActualHeight, RelativeSource={RelativeSource Self}}"/>
Это отлично работает для меня и кажется самым простым ответом (хотя я действительно не понимаю, что он делает). – brianberns
@brianberns привязывает свойство 'Width' к свойству' ActualHeight'. Но что такое? ActualHeight? Из RelativeSource! И какой относительный источник? (сам! То есть, я говорю, что «я хочу, чтобы моя собственная ширина была тем, что ActualHeight рассчитала для меня система компоновки». – heltonbiker
Спасибо, это имеет смысл. BTW, я нашел проблему с этим решением: если изменяется только ширина главного окна (например, перетаскивая ее правую границу в или из), элемент управления не знает, чтобы изменить размер, потому что его высота не изменилась. – brianberns
я использовал этот код для поддержания аспекта отношение
внутри 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;
}
}
}
удачи
Я думаю, при изменении размера будет мигать. –
Он не будет мигать, потому что WPF использует сохраненный режим, а рендеринг выполняется с меньшим приоритетом, поэтому рендеринг будет видеть окончательный результат всех событий 'SizeChanged'. Исключение: если ваше окно «SizeToContent» и его размер влияет, «SetWindowPos()» вызывается сразу во время вычислений, поэтому вы, вероятно, увидите что-то. –