5

Slider在 a中插入 aGrid会扩展它以填充可用空间,但我不希望使用网格,原因如下:

我有 aTextBlock和 a SliderUserControl滑块是弹簧加载的,可以慢跑/穿梭;当前值必须显示,因为用户不能依赖中性光标的位置,所以文本块。实现**Orientation**这个自定义滑块的属性需要旋转两个组件并调整它们的相对位置(左/右或上/下),这对于网格来说并不容易(除非我错过了一些明显的东西),而它是带一个StackPanel

回应 Aviad 的评论

Aviad,谢谢,我为痛苦道歉 ;-) 问题在标题中:当滑块位于 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 属性来显示两个控件在封闭用户控件时垂直堆叠设置为“垂直”方向。

4

4 回答 4

6

绑定非常简单!注意 StackPanel 作为 Horizo​​ntalAlignment="Stretch" 和绑定引用的名称

            <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

按照此链接访问类似问题,了解如何使用转换器更好地控制绑定。

于 2014-11-22T15:06:13.497 回答
1

您可以将 Slider 嵌入到具有 ColumnDefinition 的 Grid 列中,例如 Witdh="*"(即,将分配可用空间)。例如,您可以在下面找到如何获取 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>
于 2014-04-17T00:01:08.367 回答
0

使用 DockPanel 而不是 StackPanel 可以更好地完成这件事。你可以试试。

检查这个:http: //msdn.microsoft.com/en-us/library/bb628664.aspx

http://www.wpftutorial.net/DockPanel.html

于 2009-12-30T07:30:23.913 回答
0

简短的回答是“你不能”。StackPanel 受到其 ArrangeOverride 和 MeasureOverride 代码的限制。它根本无法扩展以填充堆叠方向上的可用空间。

当然,你可以继承 StackPanel,并以不同的方式实现它,但是 StackPanel 非常简单,如果你要这样做,你可以只继承 Panel,或者你可以继承 DockPanel(具有扩展能力),然后设置DockPanel.Dock 基于其 StackPanel.Orientation 属性在其所有子项上:

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 并在模板中使用触发器来同步 Orientation 和 DockPanel.Dock。坦率地说,在大多数情况下,我更倾向于采用这种方式而不是创建自定义面板。

于 2009-12-30T08:34:10.140 回答