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