我在WPF应用程序中有一个TabControl。在其中一个选项卡中,我有一个WebControl类(来自Awesomium.Net)。
当我使用此选项卡激活窗口大小时,将调整浏览器的大小。
当我使用另一个选项卡作为活动时调整窗口大小时,浏览器不会调整大小。当我使用浏览器控件返回选项卡时,控件仍然是旧的大小。
我该如何解决这个问题?
我试图破解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玩了一下。行为是完全相同的。
答案 0 :(得分:2)
我认为我有同样的问题,当我最初加载WebControl时,我无法获得要显示的网站的实际内容,直到我手动调整WebControl的大小。虽然受到无效呼叫的启发,但我确实设法找到了一种解决方法。 我在初次加载后调用了browser.Invalidate Measure ()。对于你的情况,我怀疑你需要把它放在TabControl的选择中。