我有一个Window
,里面有Viewbox
。根据我的Viewbox
的内容,调整Window
的大小可能会变得“混乱”。我不需要实时Viewbox
调整其内容的大小,一旦用户调整了Viewbox
的大小,就足以更新Window
。
我自己在Google上找不到有关此主题的任何信息。
是否可以“延迟”我的Viewbox
?
编辑:如果没有,模拟这种行为的最佳方法是什么?
我能想到的最好的办法是在视图框周围创建一个网格,为宽度和高度创建2个属性,使用双向绑定将它们绑定到窗口和网格,然后在绑定中设置延迟,因此网格和延迟后,其中的viewbox会调整大小,但是由于这些属性,我必须为我的窗口设置一个预定义的起始大小。
答案 0 :(得分:2)
您可以将Canvas
用作ViewBox
的容器。 (直接容器必须为Grid
,这为ViewBox
提供了调整大小的边界。)
与Grid不同,Canvas使用绝对定位,并且不使用Window
调整大小,其子代也是如此。
<Grid x:Name="root">
<Canvas>
<Grid x:Name="innerGrid">
<Viewbox>
<Content here />
</Viewbox>
</Grid>
</Canvas>
</Grid>
然后,您可以控制何时调整ViewBox
的大小(通过调整其直接容器的大小)。
以下代码受注释启发。它使用一次Timer
,当用户完成操作后计时器开始计时,并在计时器间隔过去时进行调整大小。
System.Timers.Timer timer; //Declare it as a class member, not a local field, so it won't get GC'ed.
public MainWindow()
{
InitializeComponent();
timer = new System.Timers.Timer(1000);
timer.AutoReset = false; //the Elapsed event should be one-shot
timer.Elapsed += (o, e) =>
{
//Since this is running on a background thread you need to marshal it back to the UI thread.
Dispatcher.BeginInvoke(new Action(() => {
innerGrid.Width = root.ActualWidth;
innerGrid.Height = root.ActualHeight;
}));
};
this.SizeChanged += (o, e) =>
{
//restart the time if user is still manipulating the window
timer.Stop();
timer.Start();
};
}