2011-05-10 50 views
5

在以下示例中,每當網格大小發生更改時,剪切區域大小保持不變,因爲它以絕對座標表示。如何使目標的裁剪幾何比例縮放?

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

是可以以某種方式夾,使得限幅的幾何形狀與所述剪取的物體沿縮放的區域?

解決方案後面的代碼不被接受,因爲這是在控制模板中使用的。另外,爲了清楚起見,本例中的區域是簡單的形狀。實際使用的區域是複雜且不對稱的形狀。

編輯:

它看起來像我必須更具體。這是剪輯,是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> 
+0

這確實乞討的問題:最初的規模是什麼?網格可以基於屏幕等開始爲任何大小,但幾何體具有固定大小。初始規模需要建立。那時,我會編寫一個從網格繼承的自定義面板,添加一個dep。支柱。用於初始縮放,並掛接電話進行排列;沒有「後面的代碼」,而是一個自定義控件。 – 2011-05-10 21:32:32

+0

是的,我現在意識到,關於規模。用Stretch = Rectangle替換網格填充試圖獲得與Path Stretch = Fill相同的效果。雖然沒有幫助。我正在尋找的解決方案是在控制模板中使用,而不是如何編寫自定義控件。 – AlexK 2011-05-10 23:01:01

回答

3

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> 
+0

Viewbox似乎沒有縮放網格。實際上它根本不顯示它。窺探表明Viewbox.RenderSize == 0,0。另外,不確定如何調整Viewbox的大小? – AlexK 2011-05-10 21:33:17

+0

您在剪輯時似乎對網格有一定的尺寸。將「Grid.Width」和「Grid.Height」設置爲該大小。然後視圖框會知道它有多大。 – 2011-05-10 21:37:22

1

的另一種方法,這是使用元素,而不是屬性的語法來定義剪切路徑,然後使用相同的改造上夾子,你應用到元素作爲一個整體,如:

<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>