I считают , что имена переменных не хранятся в файлах pyc / pyd / pyo, поэтому вы не можете получить точные строки кода, если у вас нет исходных файлов.
Можно всегда обрабатывать сообщение WM_WINDOWPOSCHANGING, это, позвольте нам, Вы управляете размером окна и положением во время процесса изменения размеров (в противоположность фиксации вещей после того, как пользователь закончил изменять размер).
Вот то, как Вы делаете это в WPF, я объединил этот код из нескольких источников, таким образом, могли быть некоторые синтаксические ошибки в нем.
internal enum WM
{
WINDOWPOSCHANGING = 0x0046,
}
[StructLayout(LayoutKind.Sequential)]
internal struct WINDOWPOS
{
public IntPtr hwnd;
public IntPtr hwndInsertAfter;
public int x;
public int y;
public int cx;
public int cy;
public int flags;
}
private void Window_SourceInitialized(object sender, EventArgs ea)
{
HwndSource hwndSource = (HwndSource)HwndSource.FromVisual((Window)sender);
hwndSource.AddHook(DragHook);
}
private static IntPtr DragHook(IntPtr hwnd, int msg, IntPtr wParam, IntPtr lParam, ref bool handeled)
{
switch ((WM)msg)
{
case WM.WINDOWPOSCHANGING:
{
WINDOWPOS pos = (WINDOWPOS)Marshal.PtrToStructure(lParam, typeof(WINDOWPOS));
if ((pos.flags & (int)SWP.NOMOVE) != 0)
{
return IntPtr.Zero;
}
Window wnd = (Window)HwndSource.FromHwnd(hwnd).RootVisual;
if (wnd == null)
{
return IntPtr.Zero;
}
bool changedPos = false;
// ***********************
// Here you check the values inside the pos structure
// if you want to override tehm just change the pos
// structure and set changedPos to true
// ***********************
if (!changedPos)
{
return IntPtr.Zero;
}
Marshal.StructureToPtr(pos, lParam, true);
handeled = true;
}
break;
}
return IntPtr.Zero;
}
Можно зарезервировать соотношение сторон содержания с помощью ViewBox WPF с управлением с фиксированной шириной и высотой внутри.
Позволяют нам дать этому попытку. Можно изменить атрибут "Фрагмента" ViewBox для испытания различных результатов.
Вот мой экранный выстрел:
<Window x:Class="TestWPF.Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="Window1" Height="300" Width="300">
<Viewbox Stretch="Uniform">
<StackPanel Background="Azure" Height="400" Width="300" Name="stackPanel1" VerticalAlignment="Top">
<Button Name="testBtn" Width="200" Height="50">
<TextBlock>Test</TextBlock>
</Button>
</StackPanel>
</Viewbox>
</Window>
Это - каково мое решение было.
Необходимо будет добавить это к тегу управления/окна:
Loaded="Window_Loaded"
И необходимо будет поместить это в код позади:
private double aspectRatio = 0.0;
private void Window_Loaded(object sender, RoutedEventArgs e)
{
aspectRatio = this.ActualWidth / this.ActualHeight;
}
protected override void OnRenderSizeChanged(SizeChangedInfo sizeInfo)
{
if (sizeInfo.WidthChanged)
{
this.Width = sizeInfo.NewSize.Height * aspectRatio;
}
else
{
this.Height = sizeInfo.NewSize.Width * aspectRatio;
}
}
Я попробовал прием Viewbox, и мне не нравился он. Я хотел заблокировать границу окна к определенному размеру. Это было протестировано на управлении окном, но я предполагаю, что оно работало бы над границей также.
Вы могли попытаться копировать эффект, который я часто вижу на веб-сайтах Флеш-видео. Они позволяют Вам разворачивать окно браузера любым путем, Вы любите, но только расширяете область презентации так, чтобы это соответствовало самой маленькой из высоты или ширины.
, Например, при протяжении окна вертикально приложение не изменило бы размер. Это было бы простой добавлять черные полосы к вершине и нижней части области дисплея и оставаться вертикально центрируемым.
Это может или не может быть возможно с WPF;Я не знаю.
Я ожидал, что Вы могли двухсторонний связывать ширину с высотой с помощью преобразователя значения для поддержания соотношения сторон. При передаче соотношения сторон, поскольку параметр преобразователя сделал бы это более общей целью.
Так, я попробовал это - привязка без преобразователя сначала:
<Window
...
Title="Window1" Name="Win" Height="500"
Width="{Binding RelativeSource={RelativeSource self},
Path=Height, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}">
<StackPanel>
<TextBlock>Width:</TextBlock>
<TextBlock Text="{Binding ElementName=Win, Path=Width}" />
<TextBlock>Height:</TextBlock>
<TextBlock Text="{Binding ElementName=Win, Path=Height}" />
</StackPanel>
</Window>
Странно, привязка ведет себя, как будто это односторонне, и ширина, о которой сообщают, окна (как показано в TextBlock) не согласовывается с, он - размер на экране!
идею могло бы стоить преследовать, но в этом странном поведении должны будут разобраться сначала.
Hope, которая помогает!