有沒有辦法在調整大小時控制哪些項目離開堆疊面板的可見區域?
由於控制哪些項目離開堆疊面板的可見區域
UPDATE 1
我有一個StackPanel內部按鈕中的一個固定數。調整堆疊面板的可見區域時,每個按鈕都會根據可用空間自動隱藏或顯示。我想通過某個事件來實現,當控制面板調整大小時,按鈕隱藏或顯示哪個按鈕。
原因是,我想創建一個按鈕的最小化版本,而不是隱藏按鈕。
有沒有辦法在調整大小時控制哪些項目離開堆疊面板的可見區域?
由於控制哪些項目離開堆疊面板的可見區域
UPDATE 1
我有一個StackPanel內部按鈕中的一個固定數。調整堆疊面板的可見區域時,每個按鈕都會根據可用空間自動隱藏或顯示。我想通過某個事件來實現,當控制面板調整大小時,按鈕隱藏或顯示哪個按鈕。
原因是,我想創建一個按鈕的最小化版本,而不是隱藏按鈕。
在過去,我通過根據對象的大小更改對象的ContentTemplate
來做類似的事情。
通常,我將一個事件添加到父對象的Loaded
和SizeChanged
事件中,並從那裏計算出該控件是否可見。如果沒有,我將模板更改爲較小版本的模板。
在參考your comment here有關SizeChanged
事件不觸發,這可能是因爲你有你的對象在StackPanel
,這將放大/縮小以適合大小的它的孩子,而不是大小的它的父匹配(在Grid
cell)。
您可以也可能做到這一點使用DataTrigger
和Converter
實際UI對象上,因此它會自動檢查是否模板應改在控件的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
}
爲什麼「SizeChanged將」事件WASN」的原因不過,我已經把它的高度設置爲固定值。將其設置爲「auto」後,調整其父容器的大小時觸發該事件。
你能提供一些你想要做的更多細節嗎? – Xcalibur37 2013-03-19 12:48:21
也許這可能有助於http://stackoverflow.com/questions/1517743/in-wpf-how-can-i-determine-whether-a-control-is-visible-to-the-user – Klaus78 2013-03-19 12:53:01
@ Xcalibur37我已經更新了我的問題。 – Serch00 2013-03-19 12:59:11