2013-09-24 47 views
1

我寫下來這裏,因爲我有很多的問題,這個東西,我希望你能幫助我:P如何使一個StackPanel適合其孩子的寬度

我想創建一個適合其所有Children's寬度的動態StackPanel。我會以你爲例。

假設我的StackPanel目前是空的。其寬度將是10(遠東)和它的固定高度爲30。然後我想補充的圖像,我寫下來:

BitmapImage myImage = new BitmapImage(new Uri("[PATH]")); 
Image realImage = new Image(); 
realImage.Source = myImage; 
realImage.Width = 50; 
realImage.Height = myImage.Height; 
myStackPanel.Children.Add(realImage); 

的StackPanel中沒有放大到50像素,雖然;它堅持到10px,削減我的形象。當我嘗試添加其他UI元素(如TextBlocks等)時也會發生同樣的情況。

我試圖做類似

myStackPanel.Width += realImage.Width; 

但是,當然,它沒有工作。我試圖設置StackPanel的寬度爲「自動」,但它也沒有幫助。這是StackPanel的聲明在XAML:

<Window x:Name="MainWindow1" x:Class="Proj.MainWindow" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    Title="myTitle" Height="480" Width="640" 
    Loaded="onLoad" Background="Black" MinHeight="480" MinWidth="640"> 
    <Grid> 
     ...(Other Closed Tags)... 
     <StackPanel Orientation="Horizontal" Name="myStackPanel" Height="30" Margin="135,283,458,147"/> 
    </Grid> 
</Window> 

我需要一個StackPanel,因爲我必須證明與將在屏幕上進行滾動字幕效果對象的可變數量動態欄,從右至左滑動。我不知道對象的數量和動態欄的最終寬度。

當然,如果你知道有一個其他的方式來做到這一點,我會很高興吧:)

謝謝你學習的東西!

+0

將'StackPanel'的寬度設置爲'auto' ..我想這應該有幫助 – Anirudha

+0

它已經寫在帖子中,我試過了,它不起作用:P – Vereos

+0

沒有足夠的細節。請使用所有相關的樣式等發佈周圍的XAML。您的面板可能受到家長控制的限制。閱讀面板行爲也可以幫助:http://msdn.microsoft.com/en-us/library/ms754152.aspx –

回答

1

把你的StackPanel成ScrollViewer中並設置其寬度爲自動:

<ScrollViewer HorizontalScrollBarVisibility="Auto"> 
     <StackPanel Width="Auto"> 
      .... 
     </StackPanel> 
    </ScrollViewer> 
+0

我試過了,它確實有效,謝謝。我想這是因爲這種方式StackPanel繼承了它的Parent的寬度。我對嗎?這不是我想要的,但它有一點幫助。再次感謝你。 – Vereos

+0

實際上,它不是繼承父級的寬度,但它的可用大小取決於它的父級。 –

+0

不知道爲什麼scrollviewer會在這裏提供幫助(它只是爲了提供marquee效果嗎?) - 設置爲'auto'寬度的'StackPanel'將始終伸展到完全適合它的子節點 - 它不會像父容器一樣填充'Grid'確實,只適合直接的孩子。通過上面張貼的XAML,它看起來像控件具有640的「MinWidth」。儘管我不能評論「保證金」 - 但我懷疑這與你的問題有關 – Charleh

1

我剛剛檢查,是的,你的問題是Margin。請勿使用Margin進行佈局中的絕對定位。應使用Margin作爲父控件的邊距偏移量,但在嘗試定位元素(如將項目放置在表單中心)時,應避免將元素剪輯到特定邊界。

你想要的效果是很容易與實現一個auto寬度StackPanel

<StackPanel Orientation="Horizontal" Name="myStackPanel" Height="30"> 
     <Button>Hello</Button> 
     <Button>World</Button> 
</StackPanel> 

很明顯 - 如果你需要在你的窗口中的特定位置來定位這一點,你需要確保它擁有全集裝箱寬度可用 - 使用HorizontalAlignmentGrid把你的控制

從你的佈局,我建議更多的東西是這樣的:

<Grid> 
    <Grid.RowDefinitions> 
     <RowDefinition Height="1.4*"></RowDefinition> 
     <RowDefinition Height="30"></RowDefinition> 
     <RowDefinition Height="*"></RowDefinition> 
    </Grid.RowDefinitions> 
    <StackPanel Orientation="Horizontal" Grid.Row="1" Name="myStackPanel"> 
     <Button>Hello</Button> 
     <Button>World</Button> 
    </StackPanel> 
</Grid> 

我會避免給人元素明確的尺寸,除非絕對必要 - 如果你的父容器可以支配的大小,就更好

如果你想StackPanel內水平排列的圖像,你可以設置HorizontalAlignmentCenter

+0

這實際上很好! :)但是我遇到了一個問題:當StackPanel中的對象超出屏幕寬度時,我根本找不到它們:( – Vereos

+0

是的,美麗的。網格將自己填充到父級(從那裏開始,我可以定義三個寬度爲「*」的列,以使它們全部具有相同的寬度)。Genial! –

+0

只需要2年就可以獲得+1:D – Charleh

相關問題