Почему мои панели обрезаются по всей панели, когда они меньше указанного размера? - PullRequest
5 голосов
/ 28 апреля 2011

Возможно, запутанный заголовок вопроса.

Сетка с красным прямоугольником - пример того, как она должна выглядеть.

Сетка с синим прямоугольником (не показанная на изображении) имеет поле, которое заставляет вторую сетку быть меньше, чем я ее явно установил. Который, кажется, заставляет WPF переворачивать и скрывать все за пределами установленных границ.

enter image description here

Я пытался установить клип на размер больше сетки.

Единственный способ избежать этого - написать пользовательскую панель, которая измеряет дочерние элементы с ограничением PositiveInfinity, но затем размещает дочерние элементы с правильной шириной. Этот метод имеет много проблем. Нехорошо лгать своим детям.

В любом случае, вот код:

<Window
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
x:Class="NegativeMarginTooMuchClipping.MainWindow"
x:Name="Window"
Title="MainWindow"
Width="640"
Height="400">

<Grid>
    <StackPanel Width="600" Height="300">
    <Grid Margin="40,50,60,50" Background="#FFB8B8B8" Width="500" Height="50">
        <Rectangle Fill="Red" HorizontalAlignment="Left" Height="50" VerticalAlignment="Top" Width="50" Margin="0,-50,0,0"/>
    </Grid>
    <Grid Margin="40,50,61,50" Background="#FFB8B8B8" Width="500" Height="50">
        <Rectangle Fill="Blue" HorizontalAlignment="Left" Height="50" VerticalAlignment="Top" Width="50" Margin="0,-50,0,0"/>
    </Grid>
    </StackPanel>
</Grid>

Известная проблема? Я делаю это неправильно? Нужно больше разъяснений?

1 Ответ

8 голосов
/ 28 апреля 2011

Есть три вещи, которые определяют, как что-то обрезается. Первые два ClipToBounds и Clip , но третий немного раздражает, и это GetLayoutClip .

По умолчанию для UIElement метод GetLayoutClip вернет либо нулевой, либо RectangleGeometry того же размера, что и элемент, в зависимости от свойства ClipToBounds. FrameworkElement и его производные намного сложнее. Загляните в Reflector / ILSpy, и вы поймете, что я имею в виду.

Вы можете переопределить это поведение, хотя. Если вы используете что-то вроде следующего в качестве Grid для синего прямоугольника, оно больше не будет обрезаться:

public class MyGrid : Grid {
    protected override Geometry GetLayoutClip(Size layoutSlotSize) {
        return null;
    }
}

На этом есть отличное сообщение в блоге .

...