2015-09-25 30 views
0

的邏輯據我所知,GetLayoutClip(從靜態類LayoutInformation中調用)將產生一個幾何外部的WPF中的佈局將剪輯UIElement(當然,除非,如果UIElement是其中裁剪在默認情況下處於關閉狀態 - 例如Canvas)。爲了更好地理解邏輯,我試着用Grid來試驗它,但是我得到了一些我覺得有點奇怪的結果。我已經使用下面的代碼來進行實驗。WPF的GetLayoutClip()

XAML:

<Window x:Class="TestSolution.MainWindow" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    Title="MainWindow" Width="216" Height="139" Loaded="Window_Loaded"> 
</Window> 

,並在後臺代碼:

private Grid panel; 

    public MainWindow() 
    { 
     InitializeComponent(); 
     panel = new Grid(); 
     panel.Margin = new Thickness(0,70,10,0); 
     panel.Width = 150; 
     panel.Height = 100; 
     panel.ClipToBounds = true; 
     Content = panel; 
    } 

    private void Window_Loaded(object sender, RoutedEventArgs e) 
    { 

     Debug.WriteLine(panel.DesiredSize); 
     Debug.WriteLine(panel.RenderSize); 
     Debug.WriteLine(LayoutInformation.GetLayoutClip(panel).Bounds); 
    } 

注意到,我強迫ClipToBounds。不出所料,GetLayoutClip返回一個Rectangle =(0,0,150,30),這是完全有道理的;幾何圖形始於GridPanel的原點,並將窗口下方和網格寬度外的所有內容剪切(包括任何會溢出到右邊的邊界內的東西)。

但是,如果我們關閉ClipToBounds,則矩形將變爲(-20,0,190,30)。好的,所以-20對我來說很有意義。相對於網格的原點,讓你到左邊窗口的邊緣。 0也是有意義的,因爲從頂端開始70,並且網格在Y方向開始。爲什麼190寬度雖然?電網本身終止在170和180,包括右邊的餘量。沒有什麼東西在190年自然結束。爲什麼是190?

+2

如果-20對你有意義,那麼190也應該是有意義的,因爲它意味着一個寬度,其中20被加到左邊和右邊,即20 + 150 + 20。 – Clemens

+0

@Clemens好吧,不是。 -20將簡單地定義幾何從父容器的X方向的原點開始,而在正X方向上的190最終在無處中間結束(即,網格不會在那裏結束,網格加其邊際)。儘管如此,我認爲你的觀點至少會加起來。儘管在裁剪區域的定義方面沒有多大意義。 –

+0

這是怎麼回事?我在任何地方都看不到任何20的左邊距。無論如何,我認爲網格的保證金是無關緊要的。 – Clemens

回答

0

panel.ClipToBounds = true那麼修剪區域受限於網格的邊界。但是,如果將其設置爲「假」,則內容可能會出現在面板的左側或右側,並具有負邊距。所以窗口的整個寬度被視爲剪切矩形。由於網格放置在窗口的中間,並具有-20從左側邊緣偏移,則該矩形的寬度是:

width = 216 - 20 - 3 - 3 = 190. 

凡3是窗口邊界的大小。