.net 调整大小后,如何使 WPF 窗口的大小与扩展器一致
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/841767/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
How do you keep the WPF window sized to content with an Expander after resize
提问by Paul Alexander
I've got a WPF window with SizeToContent="Height". This window contains an <Expander />that displays a list of recent activity. What I'd like is when the expander is expanded the window grows in size proportionally. When hidden the window again resizes proportionally. If the window is resized the expander and it's contained list view should grow to use the new space. (don't mind the colors there there to help me figure this out):
我有一个带有SizeToContent="Height". 该窗口包含一个<Expander />显示最近活动列表的窗口。我想要的是当扩展器展开时,窗口的大小按比例增长。当隐藏窗口再次按比例调整大小。如果窗口被调整大小,扩展器和它包含的列表视图应该增长以使用新空间。(不要介意那里的颜色可以帮助我解决这个问题):
Normal View
普通视图
alt text http://www.deploylx.com/so/wpfexpander/Open.png
替代文字 http://www.deploylx.com/so/wpfexpander/Open.png
Collapsed
折叠
alt text http://www.deploylx.com/so/wpfexpander/Closed.png
替代文字 http://www.deploylx.com/so/wpfexpander/Closed.png
Resized to new space
调整到新空间
alt text http://www.deploylx.com/so/wpfexpander/Expanded.png
替代文字 http://www.deploylx.com/so/wpfexpander/Expanded.png
So far this works great. The problem comes when the <Expander />is collapsed after the window is resized. Rather than the window collapsing again, the list view is simply hidden:
到目前为止,这很好用。<Expander />调整窗口大小后折叠时会出现问题。而不是窗口再次折叠,列表视图只是隐藏:
Collapsed after Resize
调整大小后折叠
alt text http://www.deploylx.com/so/wpfexpander/Collapsed.png
替代文字 http://www.deploylx.com/so/wpfexpander/Collapsed.png
My intuition tells me that the Heightof the window is being set when the window resizes and thus overrides the SizeToContentproperty. So, how can I get the window to keep it's size to content behavior after it's been resized?
我的直觉告诉我,Height当窗口调整大小并因此覆盖该SizeToContent属性时,正在设置窗口的。那么,如何让窗口在调整大小后保持其大小与内容行为一致?
Current XAML:
当前 XAML:
<Window x:Class="DeployLX.Licensing.Nlm.Admin.v3.DashboardWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="Dashboard" Width="504" SizeToContent="Height" Height="275">
<DockPanel>
<Menu DockPanel.Dock="Top">
<MenuItem Header="_File">
<MenuItem Header="E_xit" Command="{Binding Path=CloseCmd}" />
</MenuItem>
</Menu>
<Grid DockPanel.Dock="Top" Margin="8" ShowGridLines="True">
<Grid.RowDefinitions>
<RowDefinition />
<RowDefinition />
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition />
<ColumnDefinition />
</Grid.ColumnDefinitions>
<Grid Grid.RowSpan="2" Grid.Row="0" Grid.Column="0" Margin="0,0,8,0">
<Rectangle Fill="Red" />
<TextBlock>ActiveCount</TextBlock>
</Grid>
<Grid Grid.Row="0" Grid.Column="1" Margin="0,0,0,4">
<Rectangle Fill="Green" />
<TextBlock>Authorization</TextBlock>
</Grid>
<Grid Grid.Row="1" Grid.Column="1" Margin="0,4,0,0">
<Rectangle Fill="Blue" />
<TextBlock>Authorization</TextBlock>
</Grid>
</Grid>
<Expander Header="Recent Activity" Margin="8" IsExpanded="True">
<ListView IsSynchronizedWithCurrentItem="True" MinHeight="100">
<ListView.View>
<GridView>
<GridViewColumn Header="Status"/>
</GridView>
</ListView.View>
</ListView>
</Expander>
</DockPanel>
</Window>
UPDATE:I've tried listening to the Collapsed event of the expander and resetting the Windows SizeToContentproperty. This almost works. It will cause it to collapse the window again but when expanded again it goes back to the original 100 pixel height. While it's feasible to store and capture this info it smells hacky and prone to errors.
更新:我试过收听扩展器的 Collapsed 事件并重置 WindowsSizeToContent属性。这几乎有效。它会导致它再次折叠窗口,但再次展开时它会回到原来的 100 像素高度。虽然存储和捕获这些信息是可行的,但它闻起来很陈旧并且容易出错。
回答by Ana Betts
You have to make your window non-resizeable if you're going to use SizeToContent. Also, you shouldn't use SizeToContent="Height", and then set an explicit Height. Think about it - which one should WPF believe for the window height, the user's setting or the Content? It can't just switch back and forth between the two.
如果要使用 SizeToContent,则必须使窗口不可调整大小。此外,您不应使用 SizeToContent="Height",然后设置显式高度。想一想 - WPF 应该相信哪个窗口高度、用户设置或内容?它不能只是在两者之间来回切换。
回答by Rob Sobers
The easiest way to cope is to take manual resizing out of the equation by setting ResizeMode="NoResize"on the window. However, if you have WindowStyle="None"I've noticed that on Vista Aero this causes the window to completely shed the "chrome" and the window looks awkward. Also, this somewhat of a cop out since it looks like you want to give the user resizing capabilities.
最简单的应对方法是通过ResizeMode="NoResize"在窗口上进行设置来手动调整大小。 但是,如果您WindowStyle="None"已经注意到,在 Vista Aero 上这会导致窗口完全脱落“镀铬”,并且窗口看起来很尴尬。此外,这有点像逃避问题,因为您似乎想要为用户提供调整大小的功能。
The problem is that you have two conflicting goals: 1.) you always want SizeToContent="Height"when collapsing the expander control, 2.) you want SizeToContent="Height"when expanding the expander control unlessthe user has manually resized the window (SizeToContent="Manual"), in which case you'd like to return to the user's manual height.
问题是您有两个相互矛盾的目标:1.)SizeToContent="Height"折叠扩展器控件时总是想要的,2.)SizeToContent="Height"扩展扩展器控件时想要的,除非用户手动调整窗口大小 (SizeToContent="Manual"),其中如果您想返回到用户手动高度。
Yikes. I don't think you can get around saving the expanded height yourself. WPF won't remember the user's manual height upon expanding once you've reverted back to SizeToContent="Height"in your collapsed event handler.
哎呀。我认为您无法自己保存扩展高度。一旦您恢复到SizeToContent="Height"折叠事件处理程序中,WPF 在展开时将不会记住用户的手动高度。
回答by Marcel Kuster
Try this, it should fit your needs:
试试这个,它应该适合你的需求:
<Window ...
SizeToContent="WidthAndHeight"
Height="Auto"
Width="Auto">
回答by Thomas
As I discovered in my question, setting the Height to Double.NaN causes it to reset to SizeToContent happiness. I don't know if it will remember the size of your expander though. You might try Kent's Resizer control to move the sizing behavior to the expander rather than the containing window.
正如我在我的问题中发现的那样,将 Height 设置为 Double.NaN 会导致它重置为 SizeToContent 幸福度。我不知道它是否会记住您的扩展器的大小。您可以尝试使用 Kent 的 Resizer 控件将大小调整行为移动到扩展器而不是包含窗口。
回答by John Weldon
I've found that putting the body of my Window in a View and then putting the view as the sole child in the window solved similar problems...
我发现将我的 Window 的主体放在一个视图中,然后将视图作为唯一的孩子放在窗口中解决了类似的问题......
Not the most desirable solution, but it seems to work.
不是最理想的解决方案,但它似乎有效。

