Язык программирования C#9 и платформа .NET5
<b><!-- Элемент Rectangle с трансформацией поворотом --></b><Rectangle Height ="100" Width ="40" Fill ="Red"><Rectangle.LayoutTransform><RotateTransform Angle ="45"/></Rectangle.LayoutTransform></Rectangle>Здесь элемент
скашивается на поверхности на 20 градусов посредством трансформацииButton:SkewTransform<b><!-- Элемент Button с трансформацией скашиванием --></b><Button Content ="Click Me!" Width="95" Height="40"><Button.LayoutTransform><SkewTransform AngleX ="20" AngleY ="20"/></Button.LayoutTransform></Button>Для полноты картины ниже приведен элемент
, масштабированный на 20% с помощью трансформацииEllipse(обратите внимание на значения, установленные в свойствахScaleTransformиHeight), а также элементWidth, к которому применена группа объектов трансформации:TextBox<b><!-- Элемент Ellipse, масштабированный на 20% --></b><Ellipse Fill ="Blue" Width="5" Height="5"><Ellipse.LayoutTransform><ScaleTransform ScaleX ="20" ScaleY ="20"/></Ellipse.LayoutTransform></Ellipse><b><!-- Элемент TextBox, повернутый и скошенный --></b><TextBox Text ="Me Too!" Width="50" Height="40"><TextBox.LayoutTransform><TransformGroup><RotateTransform Angle ="45"/><SkewTransform AngleX ="5" AngleY ="20"/></TransformGroup></TextBox.LayoutTransform></TextBox>Следует отметить, что в случае применения трансформации выполнять какие-либо ручные вычисления для реагирования на проверку попадания, перемещение фокуса ввода и аналогичные действия не придется. Графический механизм WPF самостоятельно решает такие задачи. Например, на рис. 26.8 можно видеть, что элемент
по-прежнему реагирует на клавиатурный ввод.TextBoxТрансформация данных Canvas
Теперь нужно внедрить в пример
логику трансформации. Помимо применения объектов трансформации к одиночному элементу (RenderingWithShapes,Rectangleи т.д.) их можно также применять к диспетчеру компоновки, чтобы трансформировать все внутренние данные. Например, всю панельTextBoxглавного окна можно было бы визуализировать под углом:DockPanel<DockPanel LastChildFill="True"><DockPanel.LayoutTransform><RotateTransform Angle="45"/></DockPanel.LayoutTransform>...</DockPanel>В рассматриваемом примере это несколько чрезмерно, так что добавьте последнюю (менее радикальную) возможность, которая позволит пользователю зеркально отобразить целый контейнер
и всю содержащуюся в нем графику. Начните с добавления вCanvasфинального элементаToolBarсо следующим определением:ToggleButton<ToggleButton Name="flipCanvas" Click="FlipCanvas_Click"Content="Flip Canvas!"/>Внутри обработчика события
для нового элементаClickсоздайте объектToggleButtonи подключите его к объектуRotateTransformчерез свойствоCanvas, если элементLayoutTransformотмечен. Если же элементToggleButtonне отмечен, тогда удалите трансформацию, установив свойствоToggleButtonвLayoutTransform.nullprivate void FlipCanvas_Click(object sender, RoutedEventArgs e){if (flipCanvas.IsChecked == true){RotateTransform rotate = new RotateTransform(-180);canvasDrawingArea.LayoutTransform = rotate;}else{canvasDrawingArea.LayoutTransform = null;}}Запустите приложение и добавьте несколько графических фигур в область
, следя за тем, чтобы они находились впритык к ее краям. После щелчка на новой кнопке обнаружится, что фигуры выходят за границыCanvas(рис. 26.9). Причина в том, что не был определен прямоугольник отсечения.Canvas
