设置WPF Viewbox的延迟?

时间:2018-08-23 14:20:57

标签: c# wpf xaml viewbox

我有一个Window,里面有Viewbox。根据我的Viewbox的内容,调整Window的大小可能会变得“混乱”。我不需要实时Viewbox调整其内容的大小,一旦用户调整了Viewbox的大小,就足以更新Window

我自己在Google上找不到有关此主题的任何信息。

是否可以“延迟”我的Viewbox

编辑:如果没有,模拟这种行为的最佳方法是什么?

我能想到的最好的办法是在视图框周围创建一个网格,为宽度和高度创建2个属性,使用双向绑定将它们绑定到窗口和网格,然后在绑定中设置延迟,因此网格和延迟后,其中的viewbox会调整大小,但是由于这些属性,我必须为我的窗口设置一个预定义的起始大小。

1 个答案:

答案 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();
    };
}