0

縦向きと横向きの両方を使用するアプリを作成しています。アプリにはビューボックスとしてルートが含まれており、その子はスクロールビューアーです。Scrollviewer にはキャンバスが含まれています。

これで、キャンバスの現在表示されている (バインドされた) 部分は、2 ページ (水平方向に連続) と呼ばれます。ユーザーは、他の UI 要素を配置してフォームを作成できます。向きが縦向きに変更されると、製本は縦方向に連続する 2 ページになります。それとは別に、UI 要素も移動する必要があります。私が達成したいことを示す以下のスクリーンショットを参照してください。

ここに画像の説明を入力

ここに画像の説明を入力

最初にページ番号(現在のXとページサイズから)と相対XY位置(単一ページの端からの相対)を決定することでこれを達成しようとしました。数学的に正しい値を取得していますが、レンダリングが間違っています。なぜこれが起こっているのか誰にも教えてもらえますか?


更新 1

これが私のコードです。

XAML

<Grid Background="{StaticResource ApplicationPageBackgroundThemeBrush}">
    <Grid.ColumnDefinitions>
        <ColumnDefinition Width="90"/>
        <ColumnDefinition Width="*"/>
    </Grid.ColumnDefinitions>
    <Grid.RowDefinitions>
        <RowDefinition Height="120"/>
        <RowDefinition />
        <RowDefinition Height="100" />
    </Grid.RowDefinitions>
    <Button Content="Click" Click="Button_Click_1" />
    <Viewbox x:Name="vBox" Stretch="Fill" StretchDirection="Both" Grid.Row="1" Grid.Column="1">
        <ScrollViewer x:Name="sv" ScrollViewer.HorizontalScrollBarVisibility="Hidden" ScrollViewer.HorizontalScrollMode="Enabled" 
                          ScrollViewer.VerticalScrollMode="Disabled" ScrollViewer.VerticalScrollBarVisibility="Disabled">
            <Canvas x:Name="MyCanvas" Background="Aqua" Height="768" Width="1366">
                <Rectangle x:Name="sepertor1" Fill="Red" Width="20" Height="768" Canvas.Left="546.4" />
                <Rectangle x:Name="sepertor2" Fill="Red" Width="20" Height="768" Canvas.Left="1092.8" />
                <Rectangle x:Name="sepertor3" Fill="Red" Width="20" Height="768" Canvas.Left="1639.2" />
                <Rectangle x:Name="sepertor4" Fill="Red" Width="20" Height="768" Canvas.Left="2165.6" />
                <TextBox x:Name="txtFirst" Height="30" Width="200" Text="First" Canvas.Left="326.4" Canvas.Top="518" />
                <TextBox x:Name="txtSecond" Height="30" Width="200" Text="Second" Canvas.Left="566.4"  Canvas.Top="0"/>
                <TextBox x:Name="txtThird" Height="30" Width="200" Text="Third" Canvas.Left="1439.2" Canvas.Top="0"/>
                <TextBox x:Name="txtForth" Height="30" Width="200" Text="Forth" Canvas.Left="1985.6" Canvas.Top="518"/>
            </Canvas>
        </ScrollViewer>
    </Viewbox>
</Grid>

C#

//This is page's SizeChanged event
bool IsFirst = true;
private void Page_SizeChanged_1(object sender, SizeChangedEventArgs e)
{
    int PageNumber;
    if (ApplicationView.Value == ApplicationViewState.FullScreenLandscape)
    {
        sv.Height = Window.Current.Bounds.Height - 220;
        sv.Width = vBox.Width = Window.Current.Bounds.Width * 0.8;

        //Canvas contains red seperator (width = 20) which shows two page in current window bound. 
        //canvas width is of Window.Current.Bounds.Width * 0.8, so page size is Window.Current.Bounds.Width * 0.4
        //txtFirst is in first page & txtSecond is in second page.

        var PageWidth = Window.Current.Bounds.Width * 0.4;    //1366 * 0.4
        var PageHeight = Window.Current.Bounds.Height - 220;  //768 - 220
        vBox.Stretch = Stretch.Fill;
        MyCanvas.Width = PageWidth * 4;
        MyCanvas.Height = PageHeight;

        if (!IsFirst)
        {
            IsFirst = false;
            foreach (FrameworkElement control in MyCanvas.Children.Where(x => x.GetType() != typeof(Rectangle)).ToList())
            {
                var CurrentHeight = control.Height;
                var CurrentLeft = Canvas.GetLeft(control);
                var CurrentTop = Canvas.GetTop(control);
                var RelativeX = CurrentLeft % PageWidth;
                PageNumber = (int)Math.Ceiling(CurrentLeft / PageWidth);
                if (PageNumber > 1)
                {
                    if (PageNumber % 2 == 0)  //even 2, 4, 6, 8
                    {
                        control.SetValue(Canvas.LeftProperty, CurrentLeft + (PageNumber / 2) * PageWidth);
                        control.SetValue(Canvas.TopProperty, CurrentTop - PageHeight + CurrentHeight);
                    }
                    else  //odd 1, 3, 7, 5
                    {
                        //control.SetValue(Canvas.LeftProperty, (CurrentLeft - PageWidth) * 2);
                        control.SetValue(Canvas.LeftProperty, ((CurrentLeft - RelativeX) * 2) + RelativeX);
                    }
                }
            } 
        }
    }

    else if (ApplicationView.Value == ApplicationViewState.FullScreenPortrait)
    {
        IsFirst = false;
        sv.Height = Window.Current.Bounds.Height - 220;
        sv.Width = vBox.Width = Window.Current.Bounds.Width * 0.8;
        vBox.Stretch = Stretch.None;
        var PageWidth = Window.Current.Bounds.Height * 0.4; //1366 * 0.4
        var PageHeight = Window.Current.Bounds.Width - 220; //768 - 220
        MyCanvas.Width = PageWidth * 2;
        MyCanvas.Height = PageHeight * 2;

        foreach (FrameworkElement control in MyCanvas.Children.Where(x => x.GetType() != typeof(Rectangle)).ToList())
        {
            var CurrentHeight = control.Height;
            var CurrentLeft = Canvas.GetLeft(control);
            var CurrentTop = Canvas.GetTop(control);
            var RelativeX = CurrentLeft % PageWidth;
            PageNumber = (int)Math.Ceiling(CurrentLeft / PageWidth);
            if (PageNumber > 1)
            {
                if (PageNumber % 2 == 0)  //even 2, 4, 6, 8, 10
                {
                    //control.SetValue(Canvas.LeftProperty, CurrentLeft - (PageNumber / 2) * PageWidth); this is also working
                    control.SetValue(Canvas.LeftProperty, ((CurrentLeft - RelativeX) / 2));
                    control.SetValue(Canvas.TopProperty, CurrentTop + PageHeight - CurrentHeight);
                }
                else  //odd 1, 3, 5, 7, 9
                {
                    //control.SetValue(Canvas.LeftProperty, (CurrentLeft + PageWidth) / 2);
                    control.SetValue(Canvas.LeftProperty, ((CurrentLeft - RelativeX) / 2) + RelativeX);
                }
            }
        }
    }
}
4

0 に答える 0