私は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で少し遊んでみました。動作は同じです。