我有一个WPF窗口SizeToContent="Height".此窗口包含<Expander />显示最近活动列表的窗口.我想要的是当扩展器扩展时,窗口的大小按比例增长.隐藏时,窗口会再次按比例调整大小.如果窗口调整大小,扩展器和它包含的列表视图应该增长到使用新空间.(不要介意那里的颜色来帮助我解决这个问题):
普通视图
alt text http://www.deploylx.com/so/wpfexpander/Open.png
倒塌
alt text http://www.deploylx.com/so/wpfexpander/Closed.png
调整到新的空间
替代文字http://www.deploylx.com/so/wpfexpander/Expanded.png
到目前为止,这很有效.<Expander />调整窗口大小后折叠时出现问题.而不是窗口再次折叠,列表视图只是隐藏:
调整大小后折叠
替代文字http://www.deploylx.com/so/wpfexpander/Collapsed.png
我的直觉告诉我,Height当窗口调整大小并因此覆盖SizeToContent属性时窗口的设置正在被设置.那么,在调整大小后,如何让窗口保持内容行为的大小?
目前的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" …Run Code Online (Sandbox Code Playgroud) 事实上,UserControl缺少Window中的属性'SizeToContent'.
所以问题是:
在UserControl上模拟SizeToContent = WidthAndHeight行为的最简单正确的方法是什么?
UPD ...是的,我知道如果在你放置用户控件的容器中没有定义高度和宽度,它会自动获得.
但是当你将一个定义大小的userControl放入另一个没有大小的userControl时,它就不起作用,并且它们总是进入容器内部.
在这种情况下,你的第二个控件将占用它可以获得的所有空间.
使用下面的代码我期望以两个ListBox结束,它们具有相同的宽度,因为它们是两个columndefinition,带有With ="*"
而不是这看起来大小是由ListBox上的文本大小确定的,这是没有意义的,因为这个文本比ListBox小得多,因此TextBlock有足够的空间来容纳文本.
<Window x:Class="UnderstandSizing.Window5"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="Window5"
SizeToContent="WidthAndHeight"
ResizeMode="NoResize" >
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*" />
<ColumnDefinition Width="Auto" />
<ColumnDefinition Width="*" />
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition Height="Auto" />
<RowDefinition Height="Auto" />
<RowDefinition Height="Auto" />
</Grid.RowDefinitions>
<TextBlock Text="Text1longer" Grid.Row="0" Grid.Column="0" x:Name="Test1" />
<TextBlock Text="Text1" Grid.Row="0" Grid.Column="2" />
<ListBox Grid.Row="1" Grid.Column="0" Height="150" />
<ListBox Grid.Row="1" Grid.Column="2" Height="150" />
<TextBlock Grid.Row="2" Grid.ColumnSpan="3" Text="This textblock sets the max width" Width="300" />
</Grid>
</Window>
Run Code Online (Sandbox Code Playgroud)

WPF自动调整功能让我发疯...任何想法?谢谢.
编辑:在VS2008中完成的一切,以防万一.
必须有一个优雅的解决方案,但我在网上找不到任何东西.我有一个网格,其中有一列和一行宽度/高度*,包含一个ListBox.我将Window SizeToContents设置为WidthAndHeight,以允许窗口为每个UI小部件/字体集调整大小.当我向ListBox添加项目时,它会调整大小,从而导致窗口增长.
如果我改变窗口的大小,我希望ListBox调整大小,但如果我添加的内容长于ListBox的宽度,我希望滚动条出现而不是它的增长,导致Window增长.如果我为Window设置了显式大小并将SizeToContent设置为Manual(默认值),它就像我想要的那样工作.
是否有任何方法可以在启动时将窗口大小调整为内容并继续使ListBox随窗口大小增长而不是内容增长?
我的WPF应用程序中有一个窗口,偶尔会显示.当它显示时,它以一个动画淡入,当它关闭时它会淡出.没什么好看的,只是一个修改不透明度的故事板.实际上窗口永远不会真正关闭,不透明度会逐渐淡化为0,直到它再次显示为止.
此窗口是一个信息窗口,并不总是显示相同的内容.它的大小与内容(宽度和高度)相关,并且在这方面效果很好.用户选择屏幕的基本区域以显示它(TopLeft,TopRight,Center,BottomLeft,BottomRight).
在窗口淡入之前,内容会更新.因为窗口的大小适合于内容,所以窗口的大小会增加或减小.宽度和高度可以改变.
在定位窗口时,让我们说,在右下角,我只需取屏幕的WorkingArea(宽度和高度),然后减去窗口的宽度/高度,即可得到我需要的顶部和左侧位置.
逻辑工作,但我遇到的麻烦是窗口的高度和宽度没有返回内容更新后的大小,但返回的是它上次显示的大小.我假设这是因为它尚未使用新内容呈现.
如果Window比上一次显然从屏幕上伸出的那么大,这会让我感到悲伤.
我尝试在OnContentRendered事件中定位窗口,但这只在创建Window时触发一次,而不是在内容更新后,当不透明度设置为0时触发.
有没有人知道如何在它消失之前获得这个窗口的准确宽度和高度?
任何帮助,将不胜感激!!
如果我设置SizeToContent为WidthAndHeight,则WindowStartupLocation="CenterOwner"无法正常工作.而不是新窗口的中心位于其父所有者的中心,它看起来更像是子窗口的左上角位于父窗口的中心.如果我删除SizeToContent然后一切都好.怎么了?
我希望窗口尊重内部控件的MinWidth/ MinHeight和MaxWidth/ MaxHeight规范.
有人建议使用SizeToContent,但这只会有助于设置初始窗口大小,而不是约束.
其他人建议覆盖MeasureOverride并设置窗口的最小/最大高度和宽度,但这似乎有点不洁,考虑到这样一个微不足道的问题肯定会有一个纯粹的声明性解决方案.
只是提到另一个似乎合理但不起作用的解决方案(之前在一个被删除的答案中提到过):MinWidth窗口MinWidth与控件的绑定没有考虑窗口装饰.
我有一个WPF窗口,由于SizeToContent ="WidthAndHeight",它会随着时间的推移改变它的大小.最初,WindowStartupLocation ="CenterScreen"显示窗口正确居中,之后我将其重新定位:
Private Sub Window_SizeChanged(ByVal sender As Object, ByVal e As System.Windows.SizeChangedEventArgs) Handles Me.SizeChanged
Me.Top = (SystemParameters.WorkArea.Height - e.NewSize.Height) / 2
Me.Left = (SystemParameters.WorkArea.Width - e.NewSize.Width) / 2
End Sub
Run Code Online (Sandbox Code Playgroud)
但它会产生一个"跳跃",因为窗口首先调整大小并居中.
有没有办法顺利完成?
我试图根据其初始高度(当SizeToContent ="WidthAndHeight"时)设置可调整大小窗口的MinHeight/MinWidth.
我见过几个答案/解决方案:
http://weblogs.asp.net/psheriff/archive/2010/01.aspx
然而:
我试图使用MVVM模式,并希望能够在xaml中实现这一点.
我还希望将MinHeight之类的值保留在ViewModel之外 - 我不认为它们属于那里,因为它们将视图行为的一小部分与视图模型联系起来.这是我想留给UX设计师的东西.
我正在努力解决的一个解决方案是使用以下xaml/binding:
<Window
....
x:Name="mainWindow"
SizeToContent="WidthAndHeight"
ResizeMode="CanResizeWithGrip"
MinHeight="{Binding ElementName=mainWindow, Mode=OneTime, Path=ActualHeight}"
>
Run Code Online (Sandbox Code Playgroud)
我希望'Mode = OneTime'将MinHeight绑定到窗口高度的初始值.
但它不起作用..
有人可以解释一下原因吗?有符合我标准的解决方案吗?
谢谢,
标记
我有一个非常大的形式(主要适用于平板电脑),有一个TabbedPage嵌套a ScrollView和一个StackPanel包含许多控件的垂直.
我很少出现一个ListView包含几个单行项目的地方,我需要它来确定内容的大小.
我想摆脱它的滚动条,但无论如何我不希望它占用比它的项目所需的空间更多的空间.
有没有办法(甚至是丑陋的)无需编写渲染器x3平台即可实现这一目标?
这是描述我的树的伪:
<ContentPage>
<MasterDetailPage>
<MasterDetailPage.Detail>
<TabbedPage>
<ContentPage>
<ScrollView>
<StackPanel>
<!-- many controls-->
<ListView>
Run Code Online (Sandbox Code Playgroud)
渲染后,有一个巨大的差距后ListView.我怎么能避免这种情况?
我试着搞乱了,VerticalOptions并且HeightRequest没有工作.
我正在寻找一种动态方式(最好没有继承)来实现这一点,而不涉及自定义渲染器.
WPFWindow SizeToContent超出桌面大小。我想这可能是由于我的多显示器设置造成的。我应该如何限制Window只增长到活动的大小Window(不超过最大化)?
每当我尝试制作一个窗口并将其设置SizeToContent为时WidthAndHeight,在打开窗口时正确调整其内容的大小,但它会在右侧和底部添加一个小边框.在调整大小时,它会消失,当使用设置的高度和宽度时,也不会出现此问题.
这是我的意思的样本:

你可以说这不是一个大问题,虽然我发现它使我的应用程序看起来不专业,特别是当我需要提出这个时.有谁知道为什么会这样,或者是否有解决方法?我正在用C#编写这个项目.
XAML代码:
<Window x:Class="FPricing.InputDialog"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="InputDialog" Width="400" Height="300" SizeToContent="WidthAndHeight">
<StackPanel>
<Label x:Name="question">?</Label>
<TextBox x:Name="response"></TextBox>
<Button Content="OK" IsDefault="True" Click="Button_Click" />
</StackPanel>
</Window>
Run Code Online (Sandbox Code Playgroud)
在创建类时传递值.
但是,即使没有自定义底层代码,我也会在我创建的每个窗口上遇到此问题.