2009-12-29 36 views
2

插入在Grid一個Slider將擴大以填充可用空間內,但我寧願不使用網格,原因如下:如何擴大滑塊來填充可用空間,當滑塊是一個StackPanel

我有一個TextBlockSliderUserControl,滑塊是彈簧加載,並做慢跑/穿梭;當前值必須顯示,因爲用戶不能依賴中性光標的位置,所以文本塊。實現這個自定義滑塊的**Orientation**屬性需要旋轉兩個組件,並調整它們的相對位置(左/右或上/下),這對網格來說並不容易(除非我錯過了明顯的東西)與StackPanel

迴應阿維亞德的評論

阿維亞德,謝謝,我的痛苦;-)問題是在標題道歉:當滑塊是一個StackPanel內如何擴大滑塊來填充可用空間?

這個用戶控件:包括甚至在一排帶有「*」寬度的網格時

<UserControl x:Class="XXX.Preview.SelectionView" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    Height="auto" Width="auto"> 
    <GroupBox Header="Selected"> 
     <StackPanel Orientation="Horizontal"> 
      <TextBlock/> 
      <Slider/> 
     </StackPanel> 
    </GroupBox> 
</UserControl> 

不會擴大。滑塊根本沒有長度。

一個解決方案是用下面的代碼中的網格替換堆棧面板,但我不想使用網格,因爲我需要使用堆棧面板的Orientation屬性來顯示兩個垂直堆疊的控件封閉的用戶控件在方向「垂直」中設置。

+1

嘗試重寫您的文章,我正在試圖理解您的意思。另外,請包括一個實際的措辭問題:)哦,並放入一些代碼和XAML。 – 2009-12-29 20:31:29

+0

請停止創建新的用戶帳戶... – 2009-12-30 14:25:03

回答

0

簡短的回答是 「你不能。」 StackPanel被ArrangeOverride和MeasureOverride代碼限制。它根本無法擴展以在堆疊方向上填充可用空間。當然,你可以繼承StackPanel,並且以不同的方式實現它,但是StackPanel非常簡單,如果你打算這麼做,你可能只需要子類Panel,或者你可以繼承DockPanel(它具有擴展能力)

public class StackPanelExpanding : DockPanel 
{ 
    public Orientation Orientation 
    { 
    get { return (Orientation)GetValue(OrientationProperty); } 
    set { SetValue(OrientationProperty, value); } 
    } 
    public static DependencyProperty OrientationProperty = 
    StackPanel.OrientationProperty.AddOwner(typeof(StackPanelExpanding)); 

    protected override MeasureOverride(...) 
    { 
    var dock = Orientation==Orientation.Vertical ? Dock.Top : Dock.Left; 
    foreach(var element in Children) 
     SetDock(element, dock); 
    base.MeasureOverride(...); 
    } 
} 

你還是沒有說清楚爲什麼你不能只用一個DockPanel中,並使用觸發器在您的模板:),並根據其StackPanel.Orientation屬性設置DockPanel.Dock在其所有的孩子同步方向和DockPanel.Dock。坦率地說,在大多數情況下,我會更傾向於這樣做,而不是創建自定義面板。

1

您可以將Slider嵌入具有ColumnDefinition(如Witdh =「*」(即將分配可用空間))的Grid列中。例如,您可以在下面找到如何獲取TextBlock |滑塊| TextBlock佈局,並將滑塊拉伸以填充中間列的可用空間:

<Grid> 
    <Grid.ColumnDefinitions> 
     <ColumnDefinition Width="Auto"/> 
     <ColumnDefinition Width="*"/> 
     <ColumnDefinition Width="Auto"/> 
    </Grid.ColumnDefinitions> 
    <TextBlock Grid.Column="0" Text="CutOff Fraction:"/> 
    <Slider Grid.Column="1" 
      x:Name="SliderCutOffFraction" 
      IsEnabled="{Binding ElementName=ChkLanczosFilter, Path=IsChecked}" 
      HorizontalAlignment="Stretch" 
      Margin="2" 
      Minimum="0.5" 
      Maximum="5" 
      SmallChange="0.25" 
      LargeChange="0.5" 
      TickPlacement="BottomRight" 
      TickFrequency="0.5" 
      Value="1"    
      ValueChanged="SliderCutOffFraction_OnValueChanged"/> 
    <TextBlock Grid.Column="2" Width="20" 
       DockPanel.Dock="Right" 
       Text="{Binding ElementName=SliderCutOffFraction, Path=Value}" 
       TextAlignment="Center"/> 
</Grid> 
5

非常簡單的綁定! 注意,StackPanel中作爲的Horizo​​ntalAlignment =「拉伸」 並結合

  <StackPanel HorizontalAlignment="Stretch" VerticalAlignment="Top" Orientation="Horizontal" Name="ParentPanel"> 
       <Slider Minimum="1" Maximum="999999" Interval="3" Width="{Binding Path=ActualWidth, ElementName=ParentPanel}"></Slider> 
      </StackPanel> 

積分簡稱爲@somedust

按照此link到類似的問題,並學習如何擁有更多的控制權的名稱通過使用轉換器進行綁定。