The clipping behavior of the rendering system is probably one of the most confusing and least understood parts of WPF. Even experienced programmers sometimes rely on a trial-and-error approach for achieving the desired visual layout. Actually the clipping mechanism becomes much more clear once you understand the inner workings of it.
The three inputs that are used to determine the clipping geometry of an element are the UIElement´s ClipToBounds, Clip properties, and the UIElement´s protected visual GetLayoutClip method. These three inputs are combined by the layout system to create a final clipping Geometry object. This output is then assigned to the VisualClip property of the Visual class, which is used by the rendering system for the actual clipping.
How these three inputs get merged is the important part of the whole story.
The two figures below show the implementation logic of the GetLayoutClip method by the UIElement and the derived FrameworkElement classes. Note that finalSize in these figures is the size of the finalRect argument passed to the ArrangeOverride method.
As you see, the ClipToBounds property is used internally by the GetLayoutClip method.
So, once you understand the logic of the GetLayoutClip method, the rest is simple. The layout system first calls the GetLayoutClip method of the element and then calculates the intersection of the returned Geometry object and, if set, the value of the Clip property. And that intersection region is our final clipping geometry assigned to the VisualClip property.
One final point is the Canvas panel. Unlike other panel types in WPF, Canvas do not clip its children unless you set the value of the ClipToBounds property to true. The logic for this behavior lies again in the overriden implementation of the GetLayoutClip method. The figure below shows how the Canvas class implements GetLayoutClip.
The MSDN documentation greatly lacks the important details of the clipping mechanism. I hope this article can help you to better understand the whole picture.