Как я могу только позволить универсальное изменение размеров в окне WPF?

I считают , что имена переменных не хранятся в файлах pyc / pyd / pyo, поэтому вы не можете получить точные строки кода, если у вас нет исходных файлов.

17
задан Mark Carpenter 12 September 2009 в 16:46
поделиться

5 ответов

Можно всегда обрабатывать сообщение 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;
}
11
ответ дан 30 November 2019 в 12:01
поделиться

Можно зарезервировать соотношение сторон содержания с помощью ViewBox WPF с управлением с фиксированной шириной и высотой внутри.

Позволяют нам дать этому попытку. Можно изменить атрибут "Фрагмента" ViewBox для испытания различных результатов.

Вот мой экранный выстрел: enter image description here

<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>
13
ответ дан 30 November 2019 в 12:01
поделиться

Это - каково мое решение было.

Необходимо будет добавить это к тегу управления/окна:

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, и мне не нравился он. Я хотел заблокировать границу окна к определенному размеру. Это было протестировано на управлении окном, но я предполагаю, что оно работало бы над границей также.

8
ответ дан 30 November 2019 в 12:01
поделиться

Вы могли попытаться копировать эффект, который я часто вижу на веб-сайтах Флеш-видео. Они позволяют Вам разворачивать окно браузера любым путем, Вы любите, но только расширяете область презентации так, чтобы это соответствовало самой маленькой из высоты или ширины.

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

Это может или не может быть возможно с WPF;Я не знаю.

1
ответ дан 30 November 2019 в 12:01
поделиться

Я ожидал, что Вы могли двухсторонний связывать ширину с высотой с помощью преобразователя значения для поддержания соотношения сторон. При передаче соотношения сторон, поскольку параметр преобразователя сделал бы это более общей целью.

Так, я попробовал это - привязка без преобразователя сначала:

<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, которая помогает!

1
ответ дан 30 November 2019 в 12:01
поделиться
Другие вопросы по тегам:

Похожие вопросы: