3

私はWPFアプリケーションにTabControlを持っています。そのタブの 1 つに、(Awesomium.Net からの) WebControl クラスがあります。

このタブをアクティブにしてウィンドウのサイズを変更すると、ブラウザのサイズが変更されます。

別のタブをアクティブにしてウィンドウのサイズを変更すると、ブラウザのサイズが変更されません。ブラウザ コントロールのあるタブに戻ったとき、コントロールはまだ古いサイズのままです。

どうすればこれを回避できますか?

TabControl.SelectionChanged イベントをハックしようとしましたが、成功しませんでした:

私のxaml:

<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 のサイズを手動で変更するまで、Web サイトの実際のコンテンツを表示できませんでした。あなたの無効な呼び出しに触発されましたが、回避策を見つけることができました。最初の読み込み後にbrowser.Invalidate Measure () を呼び出しました。あなたの場合、TabControlの変更された選択にそれを入れる必要があると思います。

于 2012-10-19T10:02:56.980 に答える