- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
当渲染操作处于事件状态时,应用程序窗口会阻塞。IE。当设置了 ContentControl 的 Content 属性时。绘制一个用户控件,它是内容的 DataTemplate。卡住持续 5 到 10 秒,具体取决于所使用的 PC。
这个用户控件并不太复杂(大约 250 个简单控件 - 图像、文本框、文本 block 、按钮等)。布局远非完美,我没有写,我也没有时间,也不想优化布局,最多可以减少问题。
我能够完成的最好的事情是将控件包装在一个“容器”中,该容器设法绘制一个加载动画并在 ui/app 窗口卡住之前显示一个忙碌的光标。我在下面给出了完整的代码 list 。
我在代码中评论了“卡住从这里开始”,位于包装器自定义控件代码中问题的底部。那是 WPF 呈现引擎开始绘制用户控件(即其中的网格)的时候。
我经常使用我最喜欢的搜索引擎,我了解到 WPF 有一个特殊的“渲染”线程,它与 UI 线程是分开的。
其他的是在应用程序窗口卡住时隐藏它并在此期间显示“加载”动画窗口(或此的某些派生),这很容易给出下面的代码但荒谬 - 有什么方法可以缓解这种情况?
这是代码,首先是用例:
<!-- while I am being rendered, I block the UI thread. -->
<UserControl x:Class="MyUserControl"
xmlns:loading="clr-namespace:Common.UI.Controls.Loading;assembly=Common.UI.Controls">
<loading:VisualElementContainer>
<loading:VisualElementContainer.VisualElement>
<Grid>
<!-- some 500 lines of using other controls with binding, templates, resources, etc..
for the same effect try having a canvas with maaany rectangles..-->
</Grid>
</loading:VisualElementContainer.VisualElement>
</loading:VisualElementContainer>
</UserControl>
包装器自定义控件布局:
<Style TargetType="{x:Type loading:VisualElementContainer}">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type loading:VisualElementContainer}">
<Border Background="{TemplateBinding Background}"
BorderBrush="{TemplateBinding BorderBrush}"
BorderThickness="{TemplateBinding BorderThickness}">
<Grid>
<loading:LoadingAnimation x:Name="LoadingAnimation" VerticalAlignment="Center" HorizontalAlignment="Center"/>
<ContentControl x:Name="ContentHost"/>
</Grid>
</Border>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
和包装器自定义控件代码:
/// <summary>Hosts the visual element and displays a 'loading' animation and busy cursor while it is being rendered.</summary>
public class VisualElementContainer : Control
{
static VisualElementContainer()
{
DefaultStyleKeyProperty.OverrideMetadata(typeof(VisualElementContainer), new FrameworkPropertyMetadata(typeof(VisualElementContainer)));
}
private Window MyWindow;
private ContentControl ContentHost;
private LoadingAnimation LoadingAnimation;
public override void OnApplyTemplate()
{
this.ContentHost = this.GetTemplateChild("ContentHost") as ContentControl;
this.LoadingAnimation = this.GetTemplateChild("LoadingAnimation") as LoadingAnimation;
base.OnApplyTemplate();
this.MyWindow = this.FindVisualParent(typeof(Window)) as Window;
this.SetVisual(this.VisualElement);
}
private static DependencyProperty VisualElementProperty =
DependencyProperty.Register(
"VisualElement",
typeof(FrameworkElement),
typeof(VisualElementContainer),
new PropertyMetadata(null, new PropertyChangedCallback(VisualElementPropertyChanged)));
public FrameworkElement VisualElement
{
get { return GetValue(VisualElementProperty) as FrameworkElement; }
set { SetValue(VisualElementProperty, value); }
}
private static void VisualElementPropertyChanged(DependencyObject sender, DependencyPropertyChangedEventArgs e)
{
var me = sender as VisualElementContainer;
if (me == null || me.ContentHost == null || me.LoadingAnimation == null)
return;
me.RemoveVisual(e.OldValue as FrameworkElement);
me.SetVisual(e.NewValue as FrameworkElement);
}
private void RemoveVisual(FrameworkElement fwElement)
{
this.ContentHost.Content = null;
if (fwElement != null)
fwElement.Loaded -= fwElement_Loaded;
}
private void SetVisual(FrameworkElement fwElement)
{
if (fwElement == null)
{
this.ContentHost.Content = fwElement;
}
else
{
fwElement.Loaded += fwElement_Loaded;
this.SetContentVisibility(false);
this.Dispatcher
.BeginInvoke(
//freeze begins here
new Action(() => this.ContentHost.Content = fwElement),
System.Windows.Threading.DispatcherPriority.ContextIdle);
}
}
private void fwElement_Loaded(object sender, RoutedEventArgs e)
{
this.SetContentVisibility(true);
//freeze ends here.
}
private void SetContentVisibility(bool isContentVisible)
{
if (isContentVisible)
{
this.MyWindow.Cursor = Cursors.Arrow;
this.LoadingAnimation.Visibility = Visibility.Collapsed;
this.ContentHost.Visibility = Visibility.Visible;
}
else
{
this.MyWindow.Cursor = Cursors.Wait;
this.ContentHost.Visibility = Visibility.Hidden; //Setting to collapsed results in the loaded event never fireing.
this.LoadingAnimation.Visibility = Visibility.Visible;
}
}
}
最佳答案
我真的不认为你的问题实际上与渲染或布局有关。特别是只有 250 个控件,因为我看到 wpf 处理了 100 多倍而没有任何问题(它的渲染引擎效率低下但不是效率低下)。除非你滥用丰富的效果(位图效果、不透明蒙版)和糟糕的硬件或糟糕的驱动程序,或者做一些非常奇怪的事情。
考虑您需要的所有数据。是否有大图像或其他大型资源可从磁盘加载?网络运营?长计算?
根据答案,可以将某些任务推迟到另一个线程。但是没有更多信息,我可以建议的唯一解决方案是使用 HostVisual 嵌套将存在于另一个线程中的控件。不幸的是,这仅适用于非交互式 child (不需要接收用户输入的 child )。
关于c# - wpf 窗口 (ui) 被长时间渲染操作阻塞 - 可以使用后台线程进行渲染吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25485909/
在我的 OpenGL 程序中,我按顺序执行以下操作: // Drawing filled polyhedrons // Drawing points using GL_POINTS // Displa
我想传递一个包含原始页面的局部变量,这个变量只包含一个带有值的符号。 当我使用此代码时,它运行良好,可以在部分中访问 origin 变量: render :partial => "products",
为什么这个 HTML/脚本(来自“JavaScript Ninja 的 secret ”)不渲染? http://jsfiddle.net/BCL54/
我想在阅读完 View 后返回到特定的网页位置(跳转到页内 anchor )。换句话说,在 views.py 中,我想做类似的事情: context={'form':my_form} return r
我有一个包含单条折线的 PathGeometry,并以固定的间隔向该线添加一个新点(以绘制波形)。使用 Perforator 工具时,我可以看到每次向直线添加一个点时,WPF 都会将整个 PathGe
尝试了解如何消除或最小化网站上不同 JavaScript 库的渲染延迟。 例如,如果我想加载来自许多社交网络的“即时”关注按钮,它们似乎会相互阻止渲染,并且您会收到令人不快的弹出窗口。 (func
我有以 xyz 点格式表示 3D 表面(即地震断层平面)的数据。我想创建这些表面的 3D 表示。我使用 rgl 和 akima 取得了一些成功,但是它无法真正处理可能会自行折叠或在同一 x,y 点具有
我正在用 Libgdx 编写一个小游戏。 我有一个 Render[OpenGL] 线程,它不断对所有对象调用 render() 和一个更新线程不断对所有对象调用 update(double delta
我有一个 .Rmd 文件包含: ```{r, echo=FALSE, message=FALSE, results='asis'} library(xtable) print(xtable(group
关闭。这个问题是opinion-based .它目前不接受答案。 想要改进这个问题? 更新问题,以便 editing this post 可以用事实和引用来回答它. 关闭 9 年前。 Improve
请不要评判我,我只是在学习 Swift。 最近我安装了 MetalPetal 框架,并按照说明操作: https://github.com/MetalPetal/MetalPetal#example-
如果您尝试渲染 Canvas 宽度和高度之外的图像,计算机是否仍会尝试渲染它并使用资源来尝试渲染它?我只是想找出在尝试渲染图像之前检查图像是否在 Canvas 内是否更好。 最佳答案 我相信它仍然在无
我在 safari 中渲染时遇到问题。 在 firefox、chrome 和 IE 上。如下图所示: input.searchbox{-webkit-border-radius:10px;-moz-b
我正在尝试通过远程桌面在 Windows7 下运行我在 RHEL7 服务器中制作的 java 程序。 服务器中的所有java程序都无法通过远程桌面呈现。如果我在服务器位置访问服务器本身,它们看起来没问
我正处于一个新项目的设计阶段,该项目将采用数据集并将其加载到文档中,然后围绕模板呈现文档。呈现的文件可以是 CSV 数据集、PDF 营销信函、电子邮件……很多东西。数据不会是数学方程式,我只是在寻找一
有没有办法在不同的 div 下渲染 React 组件的子组件? ... ... ... ... ...
使用以下代码: import numpy as np from plotly.offline import iplot, init_notebook_mode import plotly.graph_
截至最近, meteor 的所有文档都指出 onRendered是一种在模板完成渲染时获取回调的新方法。和 rendered只是为了向后兼容。 但是,这似乎对我不起作用。 onRendered永远不会
所以在我的基本模板中,我有:{% render "EcsCrmBundle:Module:checkClock" %} 然后我创建了 ModuleController.php ... getDoctr
我正在使用 vue-mathjax 来编译我的 vue 项目中的数学方程。它正在编译第一个括号 () 之间的文本。我想防止编译括号内的字符串。在文档中我发现,对于$符号,如果我们想逃避编译,我们需要使
我是一名优秀的程序员,十分优秀!