我编写了一个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
答案 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>
只要切换IsMouseOver
或IsKeyboardFocusWithin
,边框就会闪烁。
如果您不想这样,只需更改以下行:
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"