2015-09-04 81 views
0

我創建了一個窗口,其中兩個面向垂直的堆棧面板(左側和右側)位於第三個面向水平的堆棧面板中。 左側堆疊面板可容納多個控件和一個按鈕>隱藏<,綁定到命令。我喜歡動畫一個「隱藏」正確的堆疊面板,並將窗口大小調整爲只有左側堆疊面板的寬度。如何以最簡單的方式做到這一點? 我發現WPF stackpanel visibilty animation但它不會調整窗口的大小。StackPanel/Window width change WPF

我的代碼是:

<Window x:Class="Namespace.MainWindow" 
... 
x:Name="ololo" 
     Height="400" Width="500"> 
.....  
<StackPanel Orientation="Horizontal"> 
      <StackPanel x:Name="Left" Orientation="Vertical"> 
       <Button Margin="0,10,0,0" Command="{Binding HideCommand}">Hide</Button> 
      </StackPanel> 
      <StackPanel x:Name="Right" Orientation="Vertical"> 
      <!--<Controls>--> 
      </StackPanel> 
    </StackPanel> 
+0

那麼你是否嘗試過窗口風格的鏈接XAML? – Kilazur

+0

我有資源字典 - 那裏我存儲的文本框,按鈕和字體的樣式 - 你問這個嗎? – curiousity

回答

2

您可以使用在WindowSizeToContent屬性自動調整窗口大小的內容發生變化時。

我會推薦Width值。

<Window ... 
    SizeToContent="Width" 

但是有有一個問題,這是你可能需要指定每個StackPanel的寬度,或者是你的窗口,以防止Window從調整到0寬度設置MinWidth

1

通常,動畫完全是在視圖中完成的,ViewModel不應該與窗口的大小有關。所以爲了保留MVVM,你只需要在後面的代碼中調整大小。這通常是通過查找作爲動畫的資源。

<Storyboard x:Key="AnimateWindow"> 
     <DoubleAnimation Duration="0:0:3.8" 
         Storyboard.TargetProperty="Width" 
         From="350" 
         To="100" 
         AccelerationRatio=".1"> 
     </DoubleAnimation> 
</Storyboard> 

因此,在按鈕上點擊,您還需要處理點擊事件,以便觸發動畫。點擊事件將查找資源並執行它。它也可以處理你需要的任何其他視圖特定的東西。

private void Button_Click(object sender, RoutedEventArgs e) 
{ 
     var animate= FindResource("AnimateWindow") as Storyboard; 
     if (hide != null) 
     { 
      animate.Begin(this, true); 
     } 
} 

這保留了MVVM,並應完成你想要的。

+0

AnimateWindow如何知道左側的堆棧面板? – curiousity

+0

animate.Begin(this,true)是背後的代碼,但在後面的代碼中是MainWindow本身。所以如果你在用戶控件中,你需要讓窗口調用動畫。 –

+0

我無法從VM中隱藏 - 這只是視圖上的按鈕,我認爲它在InitializeComponent()之後永遠不會爲null。稱爲 – curiousity