3

我在 WPF 应用程序中有一个 TabControl。在其中一个选项卡中,我有一个 WebControl 类(来自 Awesomium.Net)。

当我在此选项卡处于活动状态时调整窗口大小时,浏览器会调整大小。

当我在另一个选项卡处于活动状态时调整窗口大小时,浏览器不会调整大小。当我回到带有浏览器控件的选项卡时,控件仍然是旧大小。

我该如何解决这个问题?

我试图破解 TabControl.SelectionChanged 事件,但没有成功:

我的xml:

<Window
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="clr-namespace:MyApp"
    xmlns:Custom="http://schemas.awesomium.com/winfx"      
    x:Class="MyApp.MainWindow"
    Title="MainWindow"
    Height="350"
    Width="525"       >
    <Grid>    
        <TabControl
            SelectionChanged="Tabs_SelectionChanged">
            <TabItem
                Header="MyTab" Name="MyTab" >
                <Grid>
                    <Custom:WebControl x:Name="browser" />
                </Grid>
            </TabItem>
            <TabItem Header="Another tab">
                <Grid>                       
                </Grid>
            </TabItem> 
        </TabControl>
      </Grid>
</Window>

和我背后的代码:

private void Tabs_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
    var tabs = e.Source as TabControl;
    if (tabs != null && tabs.SelectedItem == myTab)
    {
        var parent = browser.Parent as FrameworkElement;
        parent.UpdateLayout();

        // also tried
        parent.InvalidateArrange();
        // also tried
        browser.InvalidateArrange();
        // also tried
        parent.Width -= 1;
        parent.InvalidateArrange();
        parent.Width += 1;

    }
}

[编辑]当我使用 WPFInspector 附加应用程序时,我可以看到 WebControl 本身实际上已调整大小。似乎是内部控制(哪一个)没有正确调整大小。

[编辑 2]另一个不成功的测试:

    private static readonly System.Reflection.PropertyInfo g_WebControlIsDirtyProperty = typeof(WebControl).GetProperty("IsDirty");
    private void Tabs_SelectionChanged(object sender, SelectionChangedEventArgs e)
    {
        var tabs = e.Source as TabControl;
        if (tabs != null && tabs.SelectedItem == myTab)
        {
            g_WebControlIsDirtyProperty.SetValue(
                browser,
                true
                );
        }
    }

[编辑 3]我玩过AvalonDock 2.0。行为是相同的。

4

1 回答 1

2

我想我遇到了同样的问题,当我最初加载 WebControl 时,我无法显示网站的实际内容,直到我手动调整 WebControl 的大小。尽管受到您的无效调用的启发,但我确实设法找到了解决方法。我在初始加载后调用了 browser.Invalidate Measure ()。对于您的情况,我怀疑您需要将其放在 TabControl 的选择更改中。

于 2012-10-19T10:02:56.980 回答