Как сделать масштабирование геометрии отсечения с целью? - PullRequest
5 голосов
/ 11 мая 2011

В следующем примере при изменении размера сетки размер области отсечения остается в том виде, как он выражен в абсолютных координатах.

<Grid Clip="M10,10 L10,150 L150,150 L150,10 Z">
    <Rectangle Fill="Red"/>
</Grid>

Можно ли как-то обрезать область так, чтобы геометрия отсечения масштабировалась вместе с обрезанным объектом?

Кодовые решения не принимаются, потому что это должно использоваться в шаблоне управления. Кроме того, область в примере является простой формой для ясности. Фактически используемая область является сложной и асимметричной формой.

EDIT:

Похоже, я должен быть более конкретным. Это фрагмент, который является частью пользовательского шаблона элемента управления для ProgressBar. При масштабировании внешней сетки прямоугольник PART_Indicator не масштабирует область отсечения. Правильный состав - когда сетка имеет размер 200x200.

<Grid>
    <Path Name="PART_Track" 
          Data="M100,0 A100,100 0 1 0 100,200 A100,100 0 1 0 100,0 Z"
          Fill="AliceBlue" Stretch="Fill"/>

    <Rectangle Clip="M100,0 A100,100 0 1 0 100,200 A100,100 0 1 0 100,0 Z"
               Stretch="Fill"
               Name="PART_Indicator" Fill="Red" 
               Height="100" VerticalAlignment="Top"/>

    <Path Name="Border" Data="M100,0 A100,100 0 1 0 100,200 A100,100 0 1 0 100,0 Z"
          Stretch="Fill" StrokeThickness="3" Stroke="Black"/>
</Grid>

UPDATE: Рик предложил отличное предложение, хотя мне потребовалось время, чтобы понять, как его использовать. Вот окончательный код.

<Viewbox StretchDirection="Both" Stretch="Fill" >
    <Grid>
        <Path Name="PART_Track" 
              Data="M100,0 A100,100 0 1 0 100,200 A100,100 0 1 0 100,0 Z"
              Fill="AliceBlue" Stretch="Fill"/>

        <Border Clip="M100,0 A100,100 0 1 0 100,200 A100,100 0 1 0 100,0 Z"
                Height="200" VerticalAlignment="Bottom">
            <Rectangle Name="PART_Indicator" Fill="Red" VerticalAlignment="Bottom" 
                       Height="40"/>
        </Border>

        <Path Name="Border"
              Data="M100,0 A100,100 0 1 0 100,200 A100,100 0 1 0 100,0 Z"
              StrokeThickness="3"
              Stretch="Fill" Stroke="Black"/>
    </Grid>
</Viewbox>

Ответы [ 2 ]

3 голосов
/ 11 мая 2011

Поместите Grid внутри Viewbox и измените размер Viewbox вместо Grid.

<Viewbox>
    <Grid Clip="M10,10 L10,150 L150,150 L150,10 Z" Width="200" Height="200">
        <Rectangle Fill="Red"/>
    </Grid>
</Viewbox>
1 голос
/ 05 августа 2013

Альтернативный подход к этому - определить обтравочный контур с использованием элемента, а не синтаксиса атрибута, а затем использовать то же преобразование для клипа, что и для элемента в целом, например ::

<Grid.Clip>
    <PathGeometry FillRule="Nonzero" Transform="{Binding Path=MatrixTransform, RelativeSource={RelativeSource TemplatedParent}, Mode=OneWay}">
        <PathFigure StartPoint="715, 96.3333" IsClosed="True" IsFilled="True">
            <PolyLineSegment IsStroked="False">
                <PolyLineSegment.Points>
                    <Point X="1255.2526" Y="540" />
                    <Point X="426.3333" Y="1342.3333" />
                     <Point X="64.66666" Y="7356.6666" />
                </PolyLineSegment.Points>
            </PolyLineSegment>
       </PathFigure>
   </PathGeometry>
</Grid.Clip>
...