过去我通过根据对象的大小更改对象的ContentTemplate 来完成类似的操作。
通常我向父对象的Loaded 和SizeChanged 事件添加一个事件,然后从那里确定控件是否可见。如果不是,我将模板更改为模板的较小版本。
参考your comment here 关于SizeChanged 事件未触发,这可能是因为您将对象放在StackPanel 中,它会增长/缩小以适应其子项的大小,而不是与大小匹配它的父级(Grid 单元格)。
您也可以在实际 UI 对象上使用DataTrigger 和Converter 来执行此操作,因此当控件的ActualWidth 或ActualHeight 更改时,它会自动检查模板是否应该更改。
我有一个帮助类,用于确定 UI 控件在其父对象中的确切可见性,以确定它是完全或部分可见,还是完全隐藏。代码可以在this answer找到,不过我这里也复制一下:
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
}