视觉状态管理与可视化树

  最近实现了一个,提供最大化,最小化,还原等功能的自定义窗体控件。开发过程中遇到一个问题,和大家分享一下。当点击最小化Button时,窗体从Normal状态变成最小化状态,再点击Restore Button,窗体变回Normal状态后,会发现最小化Button上多了一个Mouse Over样式。尝试多种方式去掉这个样式,结果都以失败告终。因为我是使用Visibility属性管理Button组的显示状态,所以怀疑是可视化树的挂载,影响了视觉状态管理。于是做了一个简单例子,代码如下:

XAML部分:

        <Button x:Name="CloseButton" HorizontalAlignment="Left"  Content="Close" Style="{StaticResource CloseButtonStyle}" Grid.Row="0"  Click="CloseButton_Click"/>
<Button x:Name="ShowButton" HorizontalAlignment="Right" Content="Show" Grid.Row="1" Click="ShowButton_Click" />
<Button x:Name="RegisterEventButton" Content="RegisterEvent" Grid.Row="3" Click="RegisterEvent_Click" HorizontalAlignment="Center" />

CloseButton_Click:

        private void CloseButton_Click(object sender, RoutedEventArgs e)
{
CloseButton.Visibility = Visibility.Collapsed;
//CloseButton.Opacity = 0;
}


ShowButton_Click:

        private void ShowButton_Click(object sender, RoutedEventArgs e)
{
CloseButton.Visibility = Visibility.Visible;
//CloseButton.Opacity = 1;
}

CurrentStateChanged:

Debug.WriteLine("OldState:  " + e.OldState.Name + "    NewState:  " + e.NewState.Name);



  并在RegisterEvent_Click中为CloseButtonStyle模板中的CommonStates状态组注册CurrentStateChanged事件用来进行跟踪。操作过程时,点RegisterEventButton,再点击CloseButton,再点击ShowButton,Debug结果如下:

使用Visibility控制Button显示状态的结果:CloseButton显示时,为MouseOver状态

使用Opacity控制Button显示的结果:CloseButton显示时,为Normal状态

Debug结果证明之前的猜测。OnApplyTemplate()调用成功之后,生成控件的可视化树。当控件隐藏时(Visibility="Collapsed"),控件的可视化树,会失去与主可视化树的挂载。这时视觉状态管理器会被”冻结“,控件会处于失去挂载时的视觉状态。也就是说,视觉状态管理,只有在控件的可视化树,与主可视化树连接时,才能正常工作。

后记:终于完成了第一篇博客(擦汗),感觉把一个东西写清楚,还是挺难的,欢迎大家指出不正确的地方。

posted @ 2011-10-22 18:17  弗特马克贝因  阅读(122)  评论(0编辑  收藏  举报