2011-04-03 44 views
0

我正在创建一个更适合MVVM的Silverlight对话框类。 ChildWindow类有一些尴尬,这使得从视图模型难以管理。如何允许Silverlight弹出窗口调整其内容大小,但阻止其增长?

这意味着我需要声明我自己的用户界面。我拥有所有传统元素,包括一个Popup控件和一个覆盖率为50%的不透明度。开/关行为也在起作用。

我遇到的问题是我的控件模板不能阻止对话框体的增长,以响应用户输入到TextBox。当字符数量增长超过默认大小时,整个对话框主体水平延伸。显然这不是正常的行为。

我想要完成的是对话框主体根据内容适当调整自己的大小,但不能响应需要更多或更少空间的子控件来扩展或缩小。这是如何控制行为,但我已经检查了its template,我无法确定这是如何工作的。

我想我看到了扩展行为,因为我的模板基于Grid s,它允许子控件的大小与它们请求的一样多。我试过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

这很有趣。我正在使用可从行为中触发的可浮动子窗口。我还有几个实现有用户输入,我想知道我是否会遇到同样的问题。自从可浮动子窗口继承子窗口后,我将发布我的结果。 – 2011-04-03 06:49:49

回答

1

不确定这是你想要的...但是 你不注册Loaded事件的“overlay”nad时Load会触发设置“overlay”的高度和宽度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> 
+0

我希望能够以声明的方式实现这一点,但我将您的建议置于原地,并且完全按照我的需要进行工作。我稍微改变了方法,将ContentControl的'Width'和'Height'设置为'DialogBody'控件的ActualWidth和ActualHeight。我给了这个答案+1,并且如果在接下来的几天里没有人用陈述方式回答,我会接受它。谢谢。 – 2011-04-03 23:17:10

+0

编辑我原来的帖子。 似乎这应该有所帮助。 现在它会生成动画,但如果需要,您可以将持续时间设置为0。 – Sonosar 2011-04-04 07:05:17

+1

感谢您更新您的答案。我认为你不能在Silverlight中使用触发器;我没有意识到支持单个'Loaded'事件。当我说“声明式方法”时,我应该更加具体。我的意思是使用布局元素的组合来实现我需要的边界,即sans行为。你的建议现在对我有用;我只是好奇,如果我没有足够的聪明,我的'网格'等,并会喜欢一些见解。你可能会得到绿色的复选标记,我只是想打开它来鼓励其他答案。谢谢。 – 2011-04-04 13:19:59

相关问题