Окно WPF растягивается неправильно/странное поведение

У меня какое-то время было странное поведение в WPF, и я не смог отследить, в чем проблема. Короче говоря, когда я изменяю размер окна снизу или справа, все работает так, как ожидалось. Но если я возьму его сверху или слева, он растянет окно, но не его содержимое. Я пробовал играть с HorizontalContentAlignment, HorizontalAlignment, VerticalContentAlignment и VerticalAlignment безрезультатно. У кого-нибудь есть идеи, в чем проблема?

Изменить размер слева:

Изменить размер сверху:

Изменить размер справа/снизу:

Вот XAML, который я использую, с удаленными внутренними элементами управления для краткости:

Параметры окна XAML:

<Window x:Class="Agent_Template.MainWindow"
    Width="{Binding Source={x:Static main:Properties.Settings.Default}, Path=Width, Mode=TwoWay}" 
    FontFamily="{Binding Source={x:Static main:Properties.Settings.Default}, Path=currentFont, Mode=TwoWay}"
    FontSize="{Binding Source={x:Static main:Properties.Settings.Default}, Path=currentFontSize, Mode=TwoWay}"
    Foreground="{Binding Source={x:Static main:Properties.Settings.Default}, Path=foregroundColor, Mode=TwoWay}"
    LocationChanged="Window_LocationChanged" Tag="parentWindow"
    Top="{Binding Source={x:Static main:Properties.Settings.Default}, Path=Top, Mode=TwoWay}"
    Topmost="False">

Настройки контейнера XAML:

<DockPanel Name="rvraDockPanel" Background="{Binding ElementName=BackColorPicker, Path=CurrentColor}" HorizontalAlignment="Stretch" VerticalAlignment="Stretch">
    <Menu Height="Auto" DockPanel.Dock="Top">
<Menu.ItemsPanel>
            <ItemsPanelTemplate>
                <DockPanel HorizontalAlignment="Stretch" />
            </ItemsPanelTemplate>
        </Menu.ItemsPanel>
<WrapPanel Name="buttonDock" Grid.Column="0" HorizontalAlignment="Center" DockPanel.Dock="Bottom" Orientation="Horizontal">
<StatusBar Name="bottomStatusBar" Height="28" MinWidth="{Binding ElementName=buttonPanel, Path=ActualWidth}" Background="{Binding ElementName=clearButton, Path=Background}" BorderBrush="White" DockPanel.Dock="Bottom" Focusable="False" FontFamily="{Binding ElementName=fontSelector, Path=SelectedValue}" FontWeight="Bold" Foreground="Blue">
        <Grid Width="{Binding ElementName=bottomStatusBar, Path=ActualWidth}" HorizontalAlignment="Center">
<TabControl Name="tabSelection" HorizontalContentAlignment="Center" Background="{Binding ElementName=BackColorPicker, Path=CurrentColor}">

Обновление: код LocationChanged в соответствии с запросом

    private void Window_LocationChanged(object sender, EventArgs e)
    {
        if (Properties.Settings.Default.windowSnap == true)
        {
            RealignChild();
        }
    }

    /// <summary>
    /// Checks position of any SlideOut windows in relation to main
    /// program window and aligns child window next to main window.
    /// </summary>
    private void RealignChild()
    {
        foreach (Window win in App.Current.Windows)
        {
            if (!win.IsFocused && win.Tag.ToString() == "childWindow" && win.Left < this.Left)
            {
                win.Left = this.Left - win.Width;                    
            }

            if (!win.IsFocused && win.Tag.ToString() == "childWindow" && win.Left > this.Left)
            {
                win.Left = this.Left + this.Width;                   
            }

            win.Top = this.Top;
        }
    }

Оказывается, это была проблема, так как когда я удалил часть XAML, проблема была исправлена. Я действительно хочу сохранить этот метод, так как есть метод, который зависит от него, чтобы держать ChildWindows из MainWindow заблокированными на краю. Я хотел бы продолжать использовать это, если это возможно.


person Keven M    schedule 16.12.2012    source источник
comment
Я просто скопировал код вашего контейнера, и он работает нормально, проблема должна быть где-то в свойствах окна, попробуйте удалить привязки для фиксированных значений, чтобы увидеть, сможете ли вы найти оскорбительное свойство.   -  person sa_ddam213    schedule 16.12.2012
comment
Я бы предложил начать с удаления привязки к Window.Width.   -  person Kent Boogaart    schedule 16.12.2012
comment
Можете ли вы разместить код вашего обработчика событий LocationChanged? Попробуйте временно отключить этот обработчик событий и посмотрите, не является ли он виновником. Сверху/слева будет изменена позиция, я не верю, что изменение размера снизу или справа.   -  person Steve Py    schedule 16.12.2012
comment
@steve-py — добавлено LocationChanged(), можете ли вы сказать, почему это проблема?   -  person Keven M    schedule 16.12.2012
comment
Хм, вы бы не подумали, что захват события и изменение положения другого окна вызовут такую ​​проблему. Раздражающий. :) Это немного длинновато, но пробовали ли вы добавить this.InvalidateVisual после выполнения репозиции внутри события LocationChanged? Хотя, если это работает, вы можете убедиться, что он срабатывает только при изменении размера формы. (если возможно)   -  person Steve Py    schedule 17.12.2012


Ответы (1)


Используете ли вы собственный метод изменения размера окна? Я знаю по своему собственному опыту, что если вы не используете Windows ResizeMethod по умолчанию (как в WindowStyle = AnythingButNone), изменяя размер из любого места внизу / справа, возникнут проблемы (ошибка Microsoft, я уверен, что немного Google подтвердит это).

Если вы не используете метод Windows ResizeMethod по умолчанию, не могли бы вы опубликовать свой код? В противном случае я должен предположить, что проблема заключается либо в ваших свойствах Windows, либо в одном из ваших базовых элементов, который охватывает все окно.

person JosephGarrone    schedule 16.12.2012