2011-04-03 21 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

相關問題