2014-09-17 2 views
1

Я ожидал следующих двух частей XAML для получения того же выхода. Тем не менее, RenderTransform на пути использует некоторую фанк-точку вращения, которую я не понимаю. Может ли кто-нибудь объяснить мне, почему эти две части XAML не эквивалентны?Путь RenderTransform не равен границе с ним с помощью RenderTransform?

<Window x:Class="CenterPathTest.MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     Title="MainWindow" Height="350" Width="525"> 
    <Canvas> 
     <Canvas.RenderTransform> 
      <TranslateTransform X="50" Y="50"/> 
     </Canvas.RenderTransform> 
     <Border Width="100" Height="200"> 
      <Border.RenderTransform> 
       <TransformGroup> 
        <TranslateTransform X="70" Y="-100"/> 
        <RotateTransform Angle="90"/> 
       </TransformGroup> 
      </Border.RenderTransform> 
      <Path Width="100" Height="200" Stretch="Uniform" 
       Data="M 0,20M 20,0M 6.04,4.51 C6.04,4.51 7.54,3 7.54,3 7.54,3 14.5,10 14.5,10 14.5,10 7.54,17 7.54,17 7.54,17 6.04,15.48 6.04,15.48 6.04,15.48 11.5,10 11.5,10 11.5,10 6.04,4.51 6.04,4.51 z" /> 
     </Border> 
    </Canvas> 
</Window> 

Я считаю, что поведение на этом следующем некорректным:

<Window x:Class="CenterPathTest.MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     Title="MainWindow" Height="350" Width="525"> 
    <Canvas> 
     <Canvas.RenderTransform> 
      <TranslateTransform X="50" Y="50"/> 
     </Canvas.RenderTransform> 
     <Path Width="100" Height="200" Stretch="Uniform" 
      Data="M 0,20M 20,0M 6.04,4.51 C6.04,4.51 7.54,3 7.54,3 7.54,3 14.5,10 14.5,10 14.5,10 7.54,17 7.54,17 7.54,17 6.04,15.48 6.04,15.48 6.04,15.48 11.5,10 11.5,10 11.5,10 6.04,4.51 6.04,4.51 z"> 
      <Path.RenderTransform> 
       <TransformGroup> 
        <TranslateTransform X="70" Y="-100"/> 
        <RotateTransform Angle="90"/> 
       </TransformGroup> 
      </Path.RenderTransform> 
     </Path> 
    </Canvas> 
</Window> 
+0

Вам не хватает вашего [RenderTransformOrigin] (http://msdn.microsoft.com/en-us/library/system.windows.uielement.rendertransformorigin (v = vs.110) .aspx) (ака, ваш " funky rotation point "), поэтому объект не знает, как это началось, поэтому он знает, как закончить после того, как вы применили другие преобразования. –

+0

'RenderTransformOrigin' по умолчанию 0,0. Это то, что я хочу. Я не могу использовать 'RenderTransformOrigin', чтобы установить начало для преобразования на пути, потому что я не знаю, что такое отношение к точке вращения. Кажется, это связано с «растяжкой» на пути. – Brannon

+0

Нет, это должно происходить от родителя, который устанавливает свои относительные границы, и на самом деле вы обычно хотите .5, .5, так как это мертвая точка, иначе вы будете буквально выходить из угла. –

ответ

2

Вы правильно о точке вращения имеющие отношение к Stretch собственности на вашем втором примере. Чтобы проверить это, вы можете изменить свой XAML так, чтобы оба примера имели Stretch="None", и вы можете видеть, что они отлично перекрываются.

Ваш второй пример - хороший пример того, как это не сделать. :) Когда у вас есть объект пути и растягивает его на неизвестную сумму, ваш по умолчанию RenderTransformOrigin также растягивается/перемещается.

Первый пример работает так, как ожидалось, потому что вы делаете TranslateTransform и RotateTransform на объекте Border, который не был растянут или масштабирован. Затем объект Path внутри границы можно масштабировать до необходимых размеров, не подвергая неблагоприятное воздействие преобразованиям, которые происходят на родительском объекте (Border).

Для того чтобы ваш второй пример вел себя одинаково с первым, вам нужно выяснить точный масштабный коэффициент, который возникает, когда Path растянут, чтобы соответствовать вашим размерам 100x200. Затем вам нужно будет использовать этот номер для вычисления нового RenderTransformOrigin или для вычисления новых значений X и Y для TranslateTransform.

..or ..

Изменение Data во втором Path объекта обратить шеврон на полную «растянутой» размер первоначально.

Учитывая сложность любого из этих решений, оставляя Path внутри объекта Border, на сегодняшний день является самым простым маршрутом.