2009-12-29 53 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到类似的问题,并学习如何拥有更多的控制权的名称通过使用转换器进行绑定。