5

Slideraに aを挿入するGridと、使用可能なスペースを埋めるために拡張されますが、次の理由からグリッドを使用しないことをお勧めします。

私は aTextBlockと aSliderを持ってUserControlいます。スライダーはバネ仕掛けで、ジョグ/シャトルを行います。ユーザーはニュートラル カーソルの位置に依存できないため、現在の値を表示する必要があります。このカスタム スライダーのプロパティを実装するに**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 に答える
0

これは、StackPanel の代わりに DockPanel を使用することでより適切に実行できます。あなたはそれを試すことができます。

これを確認してください: 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 (拡張機能を持つ) をサブクラス化して、その StackPanel.Orientation プロパティに基づいて、そのすべての子に DockPanel.Dock します。

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 に答える