0

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

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

我该如何解决这个闪烁的问题?

顺便说一句,通过 RibbonButton 调用它的代码通过 MVVM Light 的 RelayCommand 机制。

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

要查看它,请单击下面的链接。 显示闪烁问题的示例 VS 2012 项目

4

1 回答 1

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>

IsMouseOver每当或IsKeyboardFocusWithin被切换时,边框就会闪烁。

如果您不希望这样,只需更改以下几行:

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

至:

 RenderMouseOver="False" 
 RenderFocused="False" 

您需要添加对PresentationFramework.Aero.dllxmlns 的引用并添加:

xmlns:Microsoft_Windows_Themes="clr-namespace:Microsoft.Windows.Themes;assembly=PresentationFramework.Aero"
于 2013-09-18T22:42:20.067 回答