使滚动查看器填充DockPanel中的可用空间
我有点WPF noob,并且使用DockPanel在ScrollViewer的文本框中显示电子邮件的文本内容。 该面板有一个按钮栏和顶部的电子邮件标题区域,底部的按钮栏,右侧的面板以及电子邮件本身应该动态填充剩余空间:
[顶部横幅,下面是一个按钮栏和带有电子邮件标题的框。 底部是另一个全宽按钮栏。 它们之间的空间分为右侧的固定宽度面板和电子邮件内容的大型文本框。] http://rowlandsoftware.com/Screenshots/LongEmail.png
(DockPanel坐在一个网格内,它提供了最顶层的位,并在电子邮件不可见时使用。)
问题是,如果电子邮件太短或太窄,文本框无法填充剩余宽度。 在这个屏幕截图中,您可以看到框和面板之间的一些基本内容:
[文本框和面板之间是未填充的列。 可以看到它的一部分。] http://rowlandsoftware.com/Screenshots/TooNarrow.png
XAML是:
<DockPanel x:Name="EmailCanvas" Grid.Column="0" Grid.Row="1" Grid.ColumnSpan="2" Visibility="Collapsed" Height="Auto">
<DockPanel x:Name="topButtonBar" DockPanel.Dock="Top" Height="50" Background="White">
<Button x:Name="btnReturn" DockPanel.Dock="Left" Content="Return to List" Click="btnReturn_Click" />
<Image Width="15" Source="Images/transparent.png" />
<Button x:Name="btnTextToggle" Content="Plain text" Click="btnTextToggle_Click" />
<Button x:Name="btnZoomOut" Content="Zoom Out" />
<Button x:Name="btnZoomIn" Content="Zoom In" />
<Image Width="150" DockPanel.Dock="Right" Source="Images/transparent.png" />
<Button x:Name="btnPrint" DockPanel.Dock="Right" Content="Print" Width="100"/>
<Image DockPanel.Dock="Right" Source="Images/transparent.png" />
</DockPanel>
<StackPanel x:Name="EmailHeaders" Orientation="Horizontal" DockPanel.Dock="Top" Width="Auto" Background="Linen">
<StackPanel Orientation="Vertical">
<TextBlock Text="Subject:" FontSize="16" />
<TextBlock Text="Time Sent:" FontSize="16"/>
<TextBlock Text="Other Recipients: " FontSize="16"/>
</StackPanel>
<StackPanel Orientation="Vertical">
<TextBlock x:Name="labSubject" Text="Subject:" FontSize="16" />
<TextBlock x:Name="labDateTime" Text="Sent:" FontSize="16"/>
<TextBlock x:Name="labSpare" Text="Other Recipients:" FontSize="14"/>
</StackPanel>
</StackPanel>
<DockPanel x:Name="bottomButtonBar" DockPanel.Dock="Bottom" Height="80" >
<Image Width="150" DockPanel.Dock="Left" Source="Images/transparent.png" />
<Button x:Name="btnDelete" DockPanel.Dock="Left" Content="Delete" />
<Image Width="150" Source="Images/transparent.png" />
<Button x:Name="btnSave" Content="Save" />
<Image Width="150" Source="Images/transparent.png" />
<Button x:Name="btnReply" Content="Reply" />
<Image Width="150" DockPanel.Dock="Right" Source="Images/transparent.png" />
</DockPanel>
<StackPanel DockPanel.Dock="Right" Orientation="Vertical" Background="White" Width="150">
<Button x:Name="btnAttachments" Content="Attachment"/>
</StackPanel>
<ScrollViewer x:Name="eTextViewer" VerticalScrollBarVisibility="Auto" HorizontalAlignment="Stretch" HorizontalContentAlignment="Stretch">
<TextBox x:Name="eText" Background="White" HorizontalAlignment="Stretch" TextWrapping="Wrap" FontFamily="Verdana" FontSize="18" IsReadOnly="True" />
</ScrollViewer>
<!--Image Width="Auto" Height="Auto" DockPanel.Dock="Bottom" Source="Images/white.png" /-->
<WebBrowser x:Name="eHTML" Height="Auto" DockPanel.Dock="Top" Visibility="Collapsed" />
</DockPanel>
该盒子只扩展到填充可用高度,而不是宽度。 DockPanel.LastChildFill属性的文档说,
如果将LastChildFill属性设置为true(默认设置),则无论您在最后一个子元素上设置的任何其他停靠点值如何,DockPanel的最后一个子元素都会填充剩余空间。
msdn.microsoft.com/en-us/library/system.windows.controls.dockpanel.lastchildfill%28v=vs.110%29.aspx
看起来并非如此:在我的程序中,它只是填充高度,而不是宽度。 LastFillChild = true是默认值,但将其明确设置为True或False并不会造成任何区别。
有趣的是,如果在ScrollViewer上设置DockPanel.Dock =“Top”,它会填充可用宽度,但不填充高度,从而在文本框和底部按钮栏之间留下一些底层内容。 这又与文档中的说法相反,即在最后一个子元素上设置的停靠栏值将被忽略。
将HorizontalAlignment =“Stretch”设置为ScrollViewer和TextBox,将HorizontalContentAlignment =“Stretch”设置为ScrollViewer并不是很重要。
所以我的问题是,即使电子邮件的内容太短,我如何确保文本框填充DockPanel中的可用空间?
更新:我刚刚注意到,如果我删除最初设置为可见性=“折叠”的WebBrowser,那么它工作正常。 我猜想它的存在愚弄了DockPanel将其视为LastChild,即使它是Collapsed。
但是,我需要在浏览器中显示电子邮件和文本框之间进行切换,因此不能将其删除。 当他们可见时,两者都需要被视为最后一个孩子。 有任何想法吗?
更新2:所以我将scrollviewer和web浏览器包装在另一个容器中,例如网格,它是Last Child。 然后,我可以在两者之间切换,但它们都填满了空间。
多谢你们。 如果不公开羞辱我,我就不会到那里;)
DockPanel可以工作,但要注意折叠项目。 尽管文档中提到折叠项目对布局没有任何影响,但使用DockPanel时,如果它是LastChild的话。 在我的情况下,解决方案是添加另一个容器作为最后一个孩子,并将我想要切换的两个项目放在该容器中。 然后这两个将填充面板中的剩余空间。
链接地址: http://www.djcxy.com/p/50077.html上一篇: Making a Scrollviewer fill the available space in a DockPanel