将 Window 扩展到 LEFT & RIGHT 但将主要内容保持在同一位置

Expand Window to LEFT & RIGHT but keep the main content at the same position

我有一个向左和向右扩展的 window。

简化示例:

<Window x:Class="Application1.Windows.Test"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    mc:Ignorable="d"
    Title="MainWindow"
    SizeToContent="Width" Height="250">   
    <Grid>
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="Auto" />                <!--Expander LEFT-->
            <ColumnDefinition Width="25"/>
            <ColumnDefinition Width="175" />                <!--Red Content -->
            <ColumnDefinition Width="25"/>
            <ColumnDefinition Width="Auto"/>                <!--Expander RIGHT-->
        </Grid.ColumnDefinitions>
        <Grid.RowDefinitions>
            <RowDefinition Height="25"/>
            <RowDefinition Height="*"/>
            <RowDefinition Height="25"/>
        </Grid.RowDefinitions>      
    <Expander Grid.Column="0"
              Grid.Row="0"
              Grid.RowSpan="3"
              Margin="5"
              ExpandDirection="Left">
        <Grid Width="200">                
        </Grid>
    </Expander>
    <Grid Grid.Column="2"                  
          Grid.RowSpan="3" 
          Background="Red"/>
        <Expander Grid.Column="4"
                  Grid.Row="0"
                  Grid.RowSpan="3"
                  Margin="5"
                  ExpandDirection="Right">
        <Grid Width="200">
        </Grid>
    </Expander>
    </Grid>

在这里你可以看到问题是什么:

我已经看过 WPF - Expand Window to the Left

解决方案有点用,但只解决了一半的问题。

左手和右手如何做到这一点?

更新

一种可行的方法是:

(但我对这个解决方案有点不满意)

创建一个 Enum 以将最后一个 Action 存储在:

public enum ExpandActions
{
    ExpandRight,
    ExpandLeft,
    CollapsRight,
    CollapseLeft
}

然后我将 ExpandCollapse 的处理程序添加到 xaml 中的 Expanders

最后在 Window 上覆盖 SizeChanged,如 WPF - Expand Window to the Left

我们只需要这种行为,当向左扩展时 - 否则我们会终止我们的 'expand-to-right' 行为。

protected override void OnRenderSizeChanged(SizeChangedInfo sizeInfo)
{
    if (!sizeInfo.WidthChanged)
    {
        base.OnRenderSizeChanged(sizeInfo);
        return;
    }

    Hide();
    base.OnRenderSizeChanged(sizeInfo);

    //Last action was on left expander
    if(_lastAction == ExpandActions.CollapseLeft || _lastAction == ExpandActions.ExpandLeft)
    {
        Left -= (sizeInfo.NewSize.Width - sizeInfo.PreviousSize.Width);
    }                    
    Show();
}

这样做的好处是可以处理屏幕外的扩展。

可行,但我想这不是最佳解决方案。

结果是这样的: