1

印刷用に固定ページ サイズに合わせて InkCanvas のコンテンツ (ストローク) をスケーリングしようとしています。基本的に、InkCanvas から周囲の空白をすべて切り取り、縦横比を維持しながらページに合わせてストロークを拡大したいと考えています。

マークアップの下のハンドラーで、800x300 から始まるグリッドの寸法を変更し、印刷可能なページのサイズの半分の 425x550 に変更していることがわかります。

マークアップ:

 <Grid>

    <Button Height="100" Width="100" HorizontalAlignment="Left" PreviewMouseLeftButtonDown="Button_PreviewMouseLeftButtonDown_1" />

    <Grid Width="1200" Height="1400" Background="Aquamarine" HorizontalAlignment="Right" VerticalAlignment="Top">

        <Grid Background="Red" x:Name="grid" Width="800" Height="300">

            <Viewbox x:Name="vb"  Width="800" Height="300" Stretch="Fill" StretchDirection="Both">

                <InkCanvas Width="500" Height="500" Background="Transparent" IsEnabled="True"/>
            </Viewbox>

        </Grid >

    </Grid>
</Grid>

コードビハインド ファイル:

bool b = true;

private void Button_PreviewMouseLeftButtonDown_1(object sender, MouseButtonEventArgs e)
    {
        if (b)
            {
            //I toyed with using Uniform, UniformToFill, and Fill
            vb.Stretch = Stretch.Fill;
            grid.Width = 425;
            grid.Height = 550;

            //scale viewbox down until it fits horizontally
            var scaleX = grid.Width / vb.Width;
            vb.Width *= scaleX;
            vb.Height *= scaleX;

            //if constraining it to the width made it larger than it needed to be vertically, scale it down
            if (vb.Height > grid.Height)
            {
                var scaleY = grid.Height / vb.Height;
                vb.Width *= scaleY;
                vb.Height *= scaleY;
            }
            b = false;
        }
        else
        {
           //reset it back to what it was
            vb.Stretch = Stretch.Fill;
            grid.Width = 800;
            grid.Height = 300;
            vb.Width = grid.Width;
            vb.Height = grid.Height;
            b = true;
        }
4

0 に答える 0