C# 将窗口展开到左侧&;对,但保持主要内容在同一位置

C# 将窗口展开到左侧&;对,但保持主要内容在同一位置,c#,wpf,resize,expand,frameworkelement,C#,Wpf,Resize,Expand,Frameworkelement,我有一个窗口可以向左和向右扩展 简化示例: <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

我有一个窗口可以向左和向右扩展

简化示例:

<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>

在这里,您可以看到问题所在:

我已经看过了

这个解决方案是可行的,但这只解决了问题的一半

如何在左右两侧进行此操作?

更新

  • 我不希望扩展器列被修复。它们应该只显示扩展器所需的最小空间

    • 一种可行的方法是:

      (但不知何故,我对这个解决方案并不满意)

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

      public enum ExpandActions
      {
          ExpandRight,
          ExpandLeft,
          CollapsRight,
          CollapseLeft
      }
      
      然后,我将
      展开
      折叠
      的处理程序添加到xaml中的
      展开器

      最后在窗口上覆盖
      SizeChanged
      ,如中所示

      我们只想要这种行为,当扩展到左边时——否则我们会杀死我们的“扩展到右边”行为

      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();
      }
      
      好的一点是可以处理屏幕外的扩展

      这是可行的,但我想这不是最好的解决办法

      结果是:


      在我看来,它非常整洁,应该是一个很好的解决方案。PS,我喜欢你演示问题的动画:P