2013-03-19 24 views
4

有沒有辦法在調整大小時控制哪些項目離開堆疊面板的可見區域?
由於控制哪些項目離開堆疊面板的可見區域

UPDATE 1
我有一個StackPanel內部按鈕中的一個固定數。調整堆疊面板的可見區域時,每個按鈕都會根據可用空間自動隱藏或顯示。我想通過某個事件來實現,當控制面板調整大小時,按鈕隱藏或顯示哪個按鈕。

原因是,我想創建一個按鈕的最小化版本,而不是隱藏按鈕。

+0

你能提供一些你想要做的更多細節嗎? – Xcalibur37 2013-03-19 12:48:21

+0

也許這可能有助於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

+0

@ Xcalibur37我已經更新了我的問題。 – Serch00 2013-03-19 12:59:11

回答

1

在過去,我通過根據對象的大小更改對象的ContentTemplate來做類似的事情。

通常,我將一個事件添加到父對象的LoadedSizeChanged事件中,並從那裏計算出該控件是否可見。如果沒有,我將模板更改爲較小版本的模板。

在參考your comment here有關SizeChanged事件不觸發,這可能是因爲你有你的對象在StackPanel,這將放大/縮小以適合大小的它的孩子,而不是大小的它的父匹配(在Grid cell)。

您可以也可能做到這一點使用DataTriggerConverter實際UI對象上,因此它會自動檢查是否模板應改在控件的ActualWidthActualHeight變化。

我有一個輔助類用於確定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 
} 
1

爲什麼「SizeChanged將」事件WASN」的原因不過,我已經把它的高度設置爲固定值。將其設置爲「auto」後,調整其父容器的大小時觸發該事件。

相關問題