Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Windows 8 使用viewbox和canvas时UI元素呈现不正确_Windows 8_Windows Runtime_Microsoft Metro_Windows Store Apps_Winrt Xaml - Fatal编程技术网

Windows 8 使用viewbox和canvas时UI元素呈现不正确

Windows 8 使用viewbox和canvas时UI元素呈现不正确,windows-8,windows-runtime,microsoft-metro,windows-store-apps,winrt-xaml,Windows 8,Windows Runtime,Microsoft Metro,Windows Store Apps,Winrt Xaml,我正在创建一个应用程序,它同时使用方向肖像和风景。该应用程序包含根作为viewbox,其子项为scrollviewer。Scrollviewer包含画布 现在画布的当前可见(绑定)部分称为两页(水平连续)。用户可以在其上放置其他UI元素并创建表单。现在,当方向更改为纵向时,装订将有两页垂直连续。除此之外,UI元素也应该移动。请参阅下面的屏幕截图,它显示了我想要实现的目标 我尝试通过首先确定页码(从当前的X和页面大小)和相对的X和Y位置(从单页边缘相对)来实现这一点。我得到的数值在数学上是正确

我正在创建一个应用程序,它同时使用方向肖像和风景。该应用程序包含根作为viewbox,其子项为scrollviewer。Scrollviewer包含画布

现在画布的当前可见(绑定)部分称为两页(水平连续)。用户可以在其上放置其他UI元素并创建表单。现在,当方向更改为纵向时,装订将有两页垂直连续。除此之外,UI元素也应该移动。请参阅下面的屏幕截图,它显示了我想要实现的目标

我尝试通过首先确定页码(从当前的X和页面大小)和相对的X和Y位置(从单页边缘相对)来实现这一点。我得到的数值在数学上是正确的,但撕裂发生错误。有谁能告诉我为什么会这样


更新1

这是我的密码

XAML


C#

//这是页面的SizeChanged事件
bool IsFirst=true;
私有无效页\u SizeChanged\u 1(对象发送方,SizeChangedEventArgs e)
{
整数页码;
if(ApplicationView.Value==ApplicationViewState.FullScreen横向)
{
sv.Height=Window.Current.Bounds.Height-220;
sv.Width=vBox.Width=Window.Current.Bounds.Width*0.8;
//画布包含红色分隔符(宽度=20),显示当前窗口绑定的两页。
//画布宽度为Window.Current.Bounds.width*0.8,因此页面大小为Window.Current.Bounds.width*0.4
//txtFirst在第一页,txtSecond在第二页。
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=页面高度;
如果(!IsFirst)
{
IsFirst=false;
foreach(MyCanvas.Children.Where(x=>x.GetType()!=typeof(矩形)).ToList()中的FrameworkElement控件)
{
var CurrentHeight=控制高度;
var CurrentLeft=Canvas.GetLeft(控件);
var CurrentTop=Canvas.GetTop(控件);
var RelativeX=当前左侧%PageWidth;
PageNumber=(int)数学上限(CurrentLeft/PageWidth);
如果(页码>1)
{
if(页码%2==0)//偶数2,4,6,8
{
control.SetValue(Canvas.LeftProperty,CurrentLeft+(页码/2)*PageWidth);
control.SetValue(Canvas.TopProperty,CurrentTop-PageHeight+CurrentHeight);
}
else//奇数1,3,7,5
{
//control.SetValue(Canvas.LeftProperty,(CurrentLeft-PageWidth)*2);
control.SetValue(Canvas.LeftProperty,((CurrentLeft-RelativeX)*2)+RelativeX);
}
}
} 
}
}
else if(ApplicationView.Value==ApplicationViewState.FullScreenPicture)
{
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(MyCanvas.Children.Where(x=>x.GetType()!=typeof(矩形)).ToList()中的FrameworkElement控件)
{
var CurrentHeight=控制高度;
var CurrentLeft=Canvas.GetLeft(控件);
var CurrentTop=Canvas.GetTop(控件);
var RelativeX=当前左侧%PageWidth;
PageNumber=(int)数学上限(CurrentLeft/PageWidth);
如果(页码>1)
{
if(页码%2==0)//偶数2、4、6、8、10
{
//control.SetValue(Canvas.LeftProperty,CurrentLeft-(PageNumber/2)*PageWidth);这也起作用
control.SetValue(Canvas.LeftProperty,((CurrentLeft-RelativeX)/2));
control.SetValue(Canvas.TopProperty,CurrentTop+PageHeight-CurrentHeight);
}
else//奇数1,3,5,7,9
{
//control.SetValue(Canvas.LeftProperty,(CurrentLeft+PageWidth)/2);
control.SetValue(Canvas.LeftProperty,((CurrentLeft-RelativeX)/2)+RelativeX);
}
}
}
}
}

渲染中出现了什么错误?你能至少分享一些代码或屏幕截图吗?我得到了更新的canvas.top&left数学上正确的,但左上角的渲染不应用于控件。我想这可能是viewbox的问题。我将尽快共享源代码。您是否尝试过我的visual tree调试器?您根本没有在矩形上设置画布位置属性?实际上,我没有编写有问题的代码,矩形也将被移动,但我在这方面没有问题。基本上,我给新的画布顶部和左侧没有计算,因为他们的位置是固定的。