我正在创建一个对MVVM更友好的Silverlight对话框类。 ChildWindow
类有一些尴尬,这使得难以从视图模型进行管理。
这意味着我需要声明自己的用户界面。我有所有传统元素,包括Popup
控件和50%不透明度的叠加层。开/关行为也有效。
我遇到的问题是我的控件模板不会阻止对话框体增长以响应用户输入TextBox
。当字符数超出默认大小时,整个对话框主体将水平拉伸。显然这不是正常行为。
我想要实现的是对话框体对内容进行适当调整大小的方法,但不能扩展或收缩以响应需要更多或更少空间的子控件。这就是ChildWindow
控件的行为方式,但我已经检查了its template,我无法确定它是如何工作的。
我认为我看到了扩展行为,因为我的模板基于Grid
,它允许子控件的大小与它们请求的一样多。我尝试了StackPanel
,ScrollViewer
和其他布局的几种排列,但都没有成功。有没有人对ChildWindow
如何完成静态,内容大小的布局或其他建议有所了解?
这是我到目前为止的模板,仅限于基本要素:
<Popup>
<Grid x:Name="overlay">
<Border>
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="Auto" />
<RowDefinition Height="*" />
</Grid.RowDefinitions>
<Grid Grid.Row="0">
...Title...
</Grid>
<Grid Grid.Row="1">
<ContentControl Content="{TemplateBinding DialogBody}" />
</Grid>
</Grid>
</Border>
</Grid>
</Popup>
当DialogBody
包含TextBox
或其他任何更改布局大小的内容(例如隐藏控件)时,Popup
的整个内容都会增长。我不想求助于静态宽度和高度,因为我希望对话框自动调整对话框主体的大小,但最初只是。
答案 0 :(得分:1)
不确定这是你想要的......,但是 你不注册“叠加”nad的加载事件,当加载将触发时,相应地设置“叠加”ActualHeight和ActualWidth的高度和宽度。 通过这种方式,控制将获得它最初想要的大小,并且在此之后不会改变。
编辑: 您可以使用它以声明方式执行此操作。
<Grid.Triggers>
<EventTrigger RoutedEvent="Grid.Loaded">
<BeginStoryboard>
<Storyboard x:Name ="setWidth">
<DoubleAnimation Storyboard.TargetName="overlay" Storyboard.TargetProperty="Width" From="0" To="{Binding ActualWidth, ElementName=overlay}"/>
<DoubleAnimation Storyboard.TargetName="overlay" Storyboard.TargetProperty="Height" From="0" To="{Binding ActualHeight, ElementName=overlay}"/>
</Storyboard>
</BeginStoryboard>
</EventTrigger>
</Grid.Triggers>