[WPF/xaml/C#]コントロールの大きさや位置を、C#コードから変化させる(RenderTransform)


やりたいこと

xaml側で、コントロールのRenderTransformに、Transformを継承したクラス(例えばRotateTransform(回転)ScaleTransform(拡大縮小)TranslateTransform(移動)など)をセットしてパラメータを設定してやると、そのコントロールを回転、拡大縮小、移動などできるが、それをコードから行いたい。

やり方

xamlでやるのと同じように、コントロールのRenderTransformTransform系クラスをセットする。
セットするときには、TransformGroupの子要素としてTransform系クラスを登録してから、そのTransformGroupRenderTransformに入れるようにする。(ややこしいので下記サンプル参照)

サンプルコード

ここでは、ボタンを押したときに、そのボタン自身を3倍の大きさにして、横に10ピクセルほどずらすということをしている。

MainWindow.xaml
<Window x:Class="WpfApp28.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:WpfApp28"
        mc:Ignorable="d"
        Title="MainWindow" Height="450" Width="800">
    <Grid>
        <Button Width="100" Height="50" Content="ボタン" Click="Button_Click"/>
    </Grid>
</Window>

MainWindow.xaml.cs
using System.Windows;
using System.Windows.Controls;
using System.Windows.Media;

namespace WpfApp28
{
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
        }

        private void Button_Click(object sender, RoutedEventArgs e)
        {
            if (sender is Button bt)
            {
                // TransformGroupを作成(大きさを3倍にして、右に10pixcelずらす)
                var tfg = new TransformGroup();
                tfg.Children.Add(new ScaleTransform(3, 3));
                tfg.Children.Add(new TranslateTransform(10, 0));

                // ボタンのRenderTransformにセット
                bt.RenderTransform = tfg;
            }
        }
    }
}

その他、TransformGroupにsetできるもの

msdocsのTransform Classのページによると、この辺りをsetできる。

クラス 機能
RotateTransform 回転
ScaleTransform 拡大縮小
TranslateTransform 平行移動
SkewTransform スキュー変換(難しそうなので未検証)
MatrixTransform アフィン行列変換(難しそうなので未検証)

関連記事

xamlだけで同じことがしたいときはこちら
[WPF/xaml] 画面の要素を回転/拡大縮小/移動する(RenderTransform)

参考

アニメーション(WPF)
https://ufcpp.net/study/dotnet/wpf_xamlani.html