ContentTemplate
過去に、オブジェクトのサイズに基づいてオブジェクトの を変更することで、このようなことを行いました。
Loaded
通常、親オブジェクトのとイベントの両方にイベントを追加し、SizeChanged
そこからコントロールが表示されているかどうかを判断します。そうでない場合は、テンプレートを小さいバージョンのテンプレートに変更します。
イベントが発生しないというコメントをここで参照するとSizeChanged
、これはおそらく、親 (セル)StackPanel
のサイズと一致するのではなく、子のサイズに合わせて拡大/縮小するオブジェクトがあるためです。Grid
おそらく、実際の UI オブジェクトでDataTrigger
andを使用してこれを行うこともできるため、コントロールのまたはがConverter
変更されたときに Template を変更する必要があるかどうかが自動的にチェックされます。ActualWidth
ActualHeight
親オブジェクト内の 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
}