在命令处理期间将鼠标移到外部时,WPF UserControl边框闪烁

时间:2013-09-13 20:31:37

标签: wpf listview focus controls

我编写了一个WPF UserControl(我们称之为ContainerUserControl),在其中它使用了我从另一个项目构建的其他UserControl(让我们称之为OstUserControl)。在ContainerUserControl中,我有一个RibbonGroup托管一堆RibbonButtons。 OtsUserControl可以响应用户鼠标点击内部的切换按钮,并在用户单击相应的RibbonButton时运行相同的代码。

然而奇怪的是:如果我单击RibbonButton(它位于OtsUserControl的边界之外),OtsUserControl的边界周围会闪烁; 如果我单击OtsUserControl内部的切换按钮并且不将鼠标移动到OtsUserControl外部,则不会闪烁; 如果我单击OtsUserControl中的切换按钮并将鼠标移动到OtsUserControl外部,则会出现闪烁。

如何解决这个闪烁问题?

BTW,通过RibbonButton调用它的代码通过MVVM Light的RelayCommand机制。

我还在SkyDrive上共享了一个文件。运行示例应用程序时,在加载MainWindow之后,单击其中一个带有文件夹图标的树节点,然后像在Windows资源管理器中一样单击展开器按钮。你会看到没有闪烁。但是,如果选择相同的节点并单击工具栏上的“切换展开”按钮,则会看到用户控件边框闪烁。

要查看它,请单击下面的链接。  sample VS 2012 project showing the flickering problem

1 个答案:

答案 0 :(得分:0)

这是默认ListView模板(使用Blend提取):

               <ControlTemplate TargetType="{x:Type ListView}">
                    <Microsoft_Windows_Themes:ListBoxChrome x:Name="Bd" 
                                                            BorderBrush="{TemplateBinding BorderBrush}" 
                                                            BorderThickness="{TemplateBinding BorderThickness}" 
                                                            Background="{TemplateBinding Background}" 
                                                            RenderMouseOver="{TemplateBinding IsMouseOver}" 
                                                            RenderFocused="{TemplateBinding IsKeyboardFocusWithin}" 
                                                            SnapsToDevicePixels="true">
                        <ScrollViewer Padding="{TemplateBinding Padding}" Style="{DynamicResource {x:Static GridView.GridViewScrollViewerStyleKey}}">
                            <ItemsPresenter SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}"/>
                        </ScrollViewer>
                    </Microsoft_Windows_Themes:ListBoxChrome>
                    <ControlTemplate.Triggers>
                        <Trigger Property="IsGrouping" Value="true">
                            <Setter Property="ScrollViewer.CanContentScroll" Value="false"/>
                        </Trigger>
                        <Trigger Property="IsEnabled" Value="false">
                            <Setter Property="Background" TargetName="Bd" Value="{DynamicResource {x:Static SystemColors.ControlBrushKey}}"/>
                        </Trigger>
                    </ControlTemplate.Triggers>
                </ControlTemplate>

只要切换IsMouseOverIsKeyboardFocusWithin,边框就会闪烁。

如果您不想这样,只需更改以下行:

 RenderMouseOver="{TemplateBinding IsMouseOver}" 
 RenderFocused="{TemplateBinding IsKeyboardFocusWithin}" 

要:

 RenderMouseOver="False" 
 RenderFocused="False" 

您需要添加对PresentationFramework.Aero.dll的引用并添加此xmlns:

xmlns:Microsoft_Windows_Themes="clr-namespace:Microsoft.Windows.Themes;assembly=PresentationFramework.Aero"