问题标签 [freezable]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
117 浏览

c# - 字典在 Freezables

我想创建一个Freezable包含 Dictionary 作为 one 的DependencyProperty。所以我想我需要一个freezable Dictionary,因为当它被冻结时不能改变它Freezable......还是我错了?如果是这样,我真的需要做什么?

0 投票
1 回答
207 浏览

c# - WPF:Freezable 和 Visual 之间的区别

当然,WPF 中的 Freezable 类和 Visual 类具有完全不同的目的。我的问题更多地集中在实现 Visual 类或 Freezable 类的对象之间的区别。因为它们通常都与图形问题有关,所以我很困惑。

那么,以图形表示和视觉方式的 Freezable 的目的到底是什么?

0 投票
1 回答
746 浏览

c# - 以跨多个 UI 线程共享的样式使用带有 DynamicResource 的 Pen

我有一个自定义 WPF 控件,它具有类型的依赖属性Pen(用于设置控件内的分隔线样式)。

此属性的默认值应该是系统颜色——如果使用此默认值,则当用户更改系统颜色时控件必须更新(在 Windows 设置中)。

到目前为止,我已经将此默认值指定为默认控件样式的一部分:

只要我的控件仅由单个 UI 线程使用,它就可以正常工作。但是,当控件用于在单独的 UI 线程中运行的多个顶级窗口中时,会发生以下异常:

显然,在实例中使用动态资源<Pen>可以防止样式被冻结。

到目前为止,我能想到两种解决方案:

1)设置x:Shared="False"风格。每个控件实例都有自己的默认样式副本,因此不必冻结。但是,该样式还有一些其他设置器(包括一个重要的模板),所以我希望它们可以在我的控件的多个实例之间共享。

2) 将 type 的属性拆分Pen为画笔、粗细、虚线样式等单独的属性。这将导致{DynamicResource}直接在样式的设置器中使用,然后允许样式被冻结。(尽管我不确定样式何时可冻结的确切细节)此解决方案不可取,因为我有多个 Pen 类型的属性,并且每个属性都有很多用户可能想要自定义的属性。此外,我想修复此异常,而不在我的控件的公共 API 中引入重大更改。

还有其他想法吗?是否有其他方法可以为 DividerPen 属性指定这种默认值?


由于对我所说的多个 UI 线程的含义似乎有些混淆,以下是在其自己的线程中打开一个新窗口的代码:

0 投票
1 回答
392 浏览

wpf - Storyboard.TargetProperty="风格"

我正在尝试从使用触发器和主题切换到 VisualStateManager,因为 WindowsRT 似乎正在朝着这个方向发展,我想尽量减少不同的代码量。为此,我正在尝试设置一个简单的方案,该方案将在平板设备(例如 Surface 2)的大边距和桌面方案的正常外观边距之间切换。我知道我可以通过直接在对象上设置属性来做到这一点,但是如果我在一个控件中有 15 个标签,那么创建一个为每个标签设置边距的情节提要根本不支持。所以我试图用这段代码交换每个标签上的样式:

我在搜索中看到了几个示例,它们显示了在 Silverlight 和 Windows 应用商店应用程序中工作的几乎相同的模式。当我在普通的 WPF 中尝试这个时,我得到“这个可冻结的文件不能被冻结”。我用 Reflector 挖掘了代码,而 Style 不是从 DependencyObject 派生的,所以我对试图冻结的内容感到困惑。有谁知道这里发生了什么?

0 投票
0 回答
534 浏览

c# - 远程登录并在本地重新登录后可冻结异常

我收到来自远程登录应用程序的用户的错误报告。该应用程序运行良好,直到他们回到办公室并直接登录到他们的桌面 - 应用程序崩溃并且错误报告是标准的“可冻结不能被冻结”,但没有一个已知的解决方法可以解决这个问题。

应用程序中的每个 Brush 资源都用 ice:Freeze 装饰:

此外,异常作为域未处理的异常被抛出,因此现在有办法吞下它。

在过去的几个月里,我花了几个小时分析 Freezables 机器人报告的问题,但找不到任何解决方案。

发生问题的 .NET 代码:

System.InvalidOperationException:无法冻结此 Freezable。在 System.Windows.Freezable.Freeze() 在 System.Windows.SystemResources.Freeze(对象资源) 在 System.Windows.SystemResources.FindDictionaryResource(对象键,类型 typeKey,ResourceKey resourceKey,布尔 isTraceEnabled,布尔 allowDeferredResourceReference,布尔 mustReturnDeferredResourceReference,布尔& canCache) 在 System.Windows.SystemResources.FindResourceInternal(Object key, Boolean allowDeferredResourceReference, Boolean mustReturnDeferredResourceReference) 在 System.Windows.FrameworkElement.FindResourceInternal(FrameworkElement fe, FrameworkContentElement fce, DependencyProperty dp, Object resourceKey, Object unlinkedParent, Boolean allowDeferredResourceReference, Boolean mustReturnDeferredResourceReference, DependencyObject 边界元素,1 dataField, ItemStructList1 dataField, DependencyObject container, Int32 childIndex, FrameworkObject child, DependencyProperty dp, FrugalStructListSystem.Windows.StyleHelper.GetChildValue(UncommonField 1& childRecordFromChildIndex、EffectiveValueEntry& 条目、ValueLookupType& sourceType、FrameworkElementFactory templateRoot)处的1& valueLookupList、DependencyProperty dp、DependencyObject 容器、FrameworkObject 子项、Int32 childIndex、Boolean styleLookup、EffectiveValueEntry& 条目、ValueLookupType & sourceType、FrameworkElementFactory templateRoot) System.Windows.StyleHelper.GetValueFromTemplatedParent(DependencyObject 容器,Int32 childIndex,FrameworkObject 子项,DependencyProperty dp,FrugalStructList 1& childRecordFromChildIndex, FrameworkElementFactory templateRoot, EffectiveValueEntry& entry) at System.Windows.FrameworkElement.GetValueFromTemplatedParent(DependencyProperty dp, EffectiveValueEntry& entry) at System.Windows.FrameworkElement.GetRawValue(DependencyProperty dp, PropertyMetadata metadata, EffectiveValueEntry& entry) at System.Windows.FrameworkElement.EvaluateBaseValueCore(DependencyProperty dp, PropertyMetadata metadata, EffectiveValueEntry& newEntry) at System.Windows.DependencyObject.EvaluateEffectiveValue(EntryIndex entryIndex, DependencyProperty dp, PropertyMetadata metadata, EffectiveValueEntry oldEntry, EffectiveValueEntry newEntry, OperationType operationType) at System.Windows.DependencyObject.UpdateEffectiveValue(EntryIndex entryIndex, DependencyProperty dp, PropertyMetadata metadata, EffectiveValueEntry oldEntry, EffectiveValueEntry& newEntry, Boolean coerceWithDeferredReference, Boolean coerceWithCurrentValue, OperationType operationType) at System.Windows.DependencyObject.InvalidateProperty(DependencyProperty dp) at System.Windows.StyleHelper.InvalidateResourceDependentsForChild(DependencyObject container, DependencyObject child, Int32 childIndex, ResourcesChangeInfo info, FrameworkTemplate parentTemplate) at System.Windows.TreeWalkHelper.InvalidateStyleAndReferences(DependencyObject d, ResourcesChangeInfo info, Boolean containsTypeOfKey) at System.Windows.TreeWalkHelper.OnResourcesChanged(DependencyObject d, ResourcesChangeInfo info, Boolean raiseResourceChangedEvent) at System.Windows.TreeWalkHelper.OnResourcesChangedCallback(DependencyObject d, ResourcesChangeInfo info) at System.Windows.DescendentsWalker1._VisitNode(DependencyObject d)在 System.Windows.DescendentsWalker 1.VisitNode(FrameworkElement fe) at System.Windows.DescendentsWalker1.VisitNode(DependencyObject d)在 System.Windows.DescendentsWalker1.WalkLogicalChildren(FrameworkElement feParent, FrameworkContentElement fceParent, IEnumerator logicalChildren) at System.Windows.DescendentsWalker1.WalkFrameworkElementLogicalThenVisualChildren(FrameworkElement feParent, Boolean hasLogicalChildren) 在 System.Windows.DescendentsWalker 1.IterateChildren(DependencyObject d) at System.Windows.DescendentsWalker1._VisitNode(DependencyObject d) 在 System.Windows.DescendentsWalker 1.VisitNode(FrameworkElement fe) at System.Windows.DescendentsWalker1.VisitNode(DependencyObject d) 在 System.Windows.DescendentsWalker 1.WalkFrameworkElementLogicalThenVisualChildren(FrameworkElement feParent, Boolean hasLogicalChildren) at System.Windows.DescendentsWalker1.IterateChildren(DependencyObject d) 在System.Windows.DescendentsWalker 1._VisitNode(DependencyObject d) at System.Windows.DescendentsWalker1.VisitNode(FrameworkElement fe) 在 System.Windows.DescendentsWalker 1.VisitNode(DependencyObject d) at System.Windows.DescendentsWalker1.WalkLogicalChildren(FrameworkElement feParent, FrameworkContentElement fceParent, IEnumerator logicalChildren) 在 System.Windows.DescendentsWalker 1.WalkFrameworkElementLogicalThenVisualChildren(FrameworkElement feParent, Boolean hasLogicalChildren) at System.Windows.DescendentsWalker1.IterateChildren(DependencyObject d) 在 System.Windows.DescendentsWalker 1._VisitNode(DependencyObject d) at System.Windows.DescendentsWalker1.VisitNode(FrameworkElement fe) 在 System.Windows.DescendentsWalker1.VisitNode(DependencyObject d) at System.Windows.DescendentsWalker1.WalkLogicalChildren(FrameworkElement feParent, FrameworkContentElement fceParent, IEnumerator logicalChildren) 在 System.Windows.DescendentsWalker 1.WalkFrameworkElementLogicalThenVisualChildren(FrameworkElement feParent, Boolean hasLogicalChildren) at System.Windows.DescendentsWalker1.IterateChildren(DependencyObject d) 在 System.Windows.DescendentsWalker 1._VisitNode(DependencyObject d) at System.Windows.DescendentsWalker1.VisitNode(FrameworkElement fe) 在 System.Windows.DescendentsWalker 1.VisitNode(DependencyObject d) at System.Windows.DescendentsWalker1.WalkLogicalChildren(FrameworkElement feParent, FrameworkContentElement fceParent, IEnumeratorlogicalChildren) 在 System.Windows.DescendentsWalker 1.WalkFrameworkElementLogicalThenVisualChildren(FrameworkElement feParent, Boolean hasLogicalChildren) at System.Windows.DescendentsWalker1.IterateChildren(DependencyObject d) 在 System.Windows.DescendentsWalker 1._VisitNode(DependencyObject d) at System.Windows.DescendentsWalker1.VisitNode(FrameworkElement fe) 在 System.Windows.DescendentsWalker 1.VisitNode(DependencyObject d) at System.Windows.DescendentsWalker1.WalkLogicalChildren(FrameworkElement feParent, FrameworkContentElement fceParent, IEnumerator logicalChildren) 在 System.Windows.DescendentsWalker1.WalkFrameworkElementLogicalThenVisualChildren(FrameworkElement feParent, Boolean hasLogicalChildren) at System.Windows.DescendentsWalker1.IterateChildren(DependencyObject d) 在 System.Windows.DescendentsWalker 1._VisitNode(DependencyObject d) at System.Windows.DescendentsWalker1.VisitNode(FrameworkElement fe) 在 System.Windows.DescendentsWalker 1.VisitNode(DependencyObject d) at System.Windows.DescendentsWalker1.WalkLogicalChildren(FrameworkElement feParent, FrameworkContentElement fceParent, IEnumerator logicalChildren) 在 System.Windows.DescendentsWalker1.WalkFrameworkElementLogicalThenVisualChildren(FrameworkElement feParent, Boolean hasLogicalChildren) at System.Windows.DescendentsWalker1.IterateChildren(DependencyObject d) at System.Windows.DescendentsWalker`1.StartWalk(DependencyObject startNode, Boolean skipStartNode) at System.Windows.TreeWalkHelper.InvalidateOnResourcesChange(FrameworkElement fe, FrameworkContentElement fce, ResourcesChangeInfo info) 在 System.Windows.SystemResources.InvalidateTreeResources (Object args) 在 System.Windows.Threading.ExceptionWrapper.InternalRealCall(Delegate callback, Object args, Int32 numArgs) 在 MS.Internal.Threading.ExceptionFilterHelper.TryCatchWhen(Object source, Delegate method, Object args, Int32 numArgs, Delegate catchHandler)

0 投票
0 回答
49 浏览

c# - WPF - 强制情节提要解冻和重新冻结资源

在我的 WPF 应用程序中,我允许用户在自定义 Light 和 Dark 主题之间切换。我使用一组控制模板并通过交换画笔资源来处理主题切换。

除了在控制模板的情节提要中的动画中引用的画笔之外,这非常有效。

故事板冻结了其中的所有资源。

这迫使我清除所有合并的词典并重新加载它们。我试图避免这种情况。

问:有没有办法强制 Storyboard 从本质上解冻、更新其资源并重新冻结?

我尝试克隆 Storyboard 并更新父 VisualState,但这似乎不起作用。

那里有任何核心 WPF 大师吗?:)

0 投票
0 回答
82 浏览

c# - 使用 ImageDrawings 进行线程化并冻结

我在后台线程中创建图像时遇到问题。我有一个应该与其他图标合并的主图标(16x16 像素),可以是叠加层。我的代码是这样的:

代码在第三行退出,因为调用线程不是对象的所有者。我对此有点困惑,因为该对象是在上面一行创建的。变量_ConnectionIcon是一个ImageSource并且被冻结。

确切的错误信息是The calling thread cannot access this object because a different thread owns it

为什么我不能冻结一个在上面一行创建的对象?

0 投票
1 回答
1046 浏览

wpf - How to freeze Path Data

We have many complex Paths in our WPF application. An example would be:

Most of our Control Templates require extensive use of vector graphics and multiple effect are applied on these paths.

For performance reasons, we want to freeze the Data of these paths since it won't be changed. This syntax we're using creates a StreamGeometry and assigns data to it. StreamGeometry is freezable but how can we freeze it in our xaml?

0 投票
1 回答
3127 浏览

c# - Cannot set a property on object because it is in a read-only state

In my XAML I have the following:

gla is a GridLengthAnimationObject.

I am getting the above error when I try to set my Dependency Property

Error occurs here:

Stack Trace

In my LeftGrid I have a number of Buttons. The LeftGrid has a default width of 7* while the RightGrid is initially set to 0* (not visible). When a Button is clicked in the LeftGrid, the RightGrid should expand to a width of 3*. This expansion of the RightGrid should be animated. Finally if the RightGrid is expanded and a button in the LeftGrid is clicked twice in succession, the RightGrid should shrink back to 0*.

0 投票
1 回答
232 浏览

wpf - 有没有办法让 DynamicResource 对于 ResourceDictionary 中的 Freezable 是动态的?

我在 Brushes.xaml 中有这个:

并在 Generic.xaml 中像这样使用它:

问题是 wpf 冻结了画笔,所以DynamicResource没有效果。

有没有一种干净的方法来解决这个问题?我只能想到讨厌的黑客。