4

サイズ変更時にスタックパネルの表示領域から出るアイテムを制御する方法はありますか?
ありがとう

更新1
スタックパネル内に固定数のボタンがあります。スタックパネルの表示領域のサイズを変更すると、使用可能なスペースに応じて、各ボタンが自動的に非表示または表示されます。何らかのイベントを通じて、スタックパネルのサイズ変更が発生したときに、どのボタンを非表示にするか、または表示するかを制御したいと思います。

その理由は、ボタンを非表示にするのではなく、最小化されたバージョンのボタンを作成したいからです。

4

2 に答える 2

1

「SizeChanged」イベントが発生しなかった理由は、高さを固定値に設定していたためです。「自動」に設定した後、親コンテナーのサイズを変更するときにイベントが発生しました。

于 2013-03-19T16:59:31.073 に答える
1

ContentTemplate過去に、オブジェクトのサイズに基づいてオブジェクトの を変更することで、このようなことを行いました。

Loaded通常、親オブジェクトのとイベントの両方にイベントを追加し、SizeChangedそこからコントロールが表示されているかどうかを判断します。そうでない場合は、テンプレートを小さいバージョンのテンプレートに変更します。

イベントが発生しないというコメントをここで参照するとSizeChanged、これはおそらく、親 (セル)StackPanelのサイズと一致するのではなく、子のサイズに合わせて拡大/縮小するオブジェクトがあるためです。Grid

おそらく、実際の UI オブジェクトでDataTriggerandを使用してこれを行うこともできるため、コントロールのまたはがConverter変更されたときに Template を変更する必要があるかどうかが自動的にチェックされます。ActualWidthActualHeight

親オブジェクト内の UI コントロールの正確な可視性を判断し、完全にまたは部分的に表示されているか、完全に非表示になっているかを確認するために使用するヘルパー クラスがあります。コードはこの回答にありますが、ここにもコピーします。

public enum ControlVisibility
{
    Hidden,
    Partial,
    Full,
    FullHeightPartialWidth,
    FullWidthPartialHeight
}


/// <summary>
/// Checks to see if an object is rendered visible within a parent container
/// </summary>
/// <param name="child">UI element of child object</param>
/// <param name="parent">UI Element of parent object</param>
/// <returns>ControlVisibility Enum</returns>
public static ControlVisibility IsObjectVisibleInContainer(
    FrameworkElement child, UIElement parent)
{
    GeneralTransform childTransform = child.TransformToAncestor(parent);
    Rect childSize = childTransform.TransformBounds(
        new Rect(new Point(0, 0), new Point(child.Width, child.Height)));

    Rect result = Rect.Intersect(
        new Rect(new Point(0, 0), parent.RenderSize), childSize);

    if (result == Rect.Empty)
    {
        return ControlVisibility.Hidden;
    }
    if (result.Height == childSize.Height && result.Width == childSize.Width)
    {
        return ControlVisibility.Full;
    }
    if (result.Height == childSize.Height)
    {
        return ControlVisibility.FullHeightPartialWidth;
    }
    if (result.Width == childSize.Width)
    {
        return ControlVisibility.FullWidthPartialHeight;
    }
    return ControlVisibility.Partial;
}

次のようにコントロールの可視性を取得できます。

ControlVisibility ctrlVisibility = 
    WPFHelpers.IsObjectVisibleInContainer(button, parent);

if (ctrlVisibility == ControlVisibility.Full 
    || isVisible == ControlVisibility.FullWidthPartialHeight)
{
    // Set big template
}
else
{
    // Set little template
}
于 2013-03-19T13:30:39.750 に答える