问题标签 [wpf-4.0]

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 投票
2 回答
10693 浏览

c# - 在进行 ReportProgress 时,BackgroundWorker 或(Dispatcher)操作已经完成

我使用DispatcherTimer是因为我需要每隔几分钟做一次手术。在此我调用 aBackgroundWorker来完成我的工作,然后使用附加到计时器的调度程序来更新我的 UI。我认为我遇到的错误与计时器有关,但我不确定。是调度员完成还是后台工作人员完成?如何在 foreach 中执行 ReportProgress?

错误:

此操作已经调用了 OperationCompleted,并且进一步的调用是非法的。

这样做时:

这是简化的:

编辑: 堆栈跟踪:

0 投票
3 回答
14517 浏览

.net - 为什么我不能使用 WPF 4.0 中应用的 Aero 主题设置控件的样式?

我最近将一个项目从 WPF 3.5 转换为 WPF 4.0。从功能上讲,一切正常,但我在 Aero 主题之上应用的 DataGrid 样式突然停止工作。从下面的前后图片中可以看出,我的 DataGrids 从具有 Aero 外观加上粗体标题、额外填充和交替行格式变成了简单的“Aero”。除了删除对 WPF 工具包的所有引用(因为 DataGrid 现在是 WPF 4.0 的本机版本),我真的没有更改任何关于我的代码/标记的内容。

之前(WPF 工具包数据网格)

看起来像带有粗体标题、额外填充和交替行样式的 Aero

之后(.NET 4.0 DataGrid)

看起来像 Aero 什么都没有

正如我在之前的问题中了解到的那样,如果我停止引用 Aero 资源字典,我可以让自定义 DataGrid 样式再次工作,但是在 Windows XP 上一切看起来都是“Luna”(这不是我想要的)。

那么,如何确保我的应用程序始终使用 Aero 主题,但仍然在 WPF 4.0 中在该主题之上应用样式?

这是我的 App.xaml 代码:

这是我的 DataGridResourceDictionary.xaml 代码:

这是一个使用示例:

编辑

我突然想到,问题可能是我引用了错误版本的 Aero 框架。

这是我现在拥有的:

这应该更新到 4.0 版吗?第 4 版的版本是什么PublicKeyToken(或者我该如何解决)?

0 投票
5 回答
69387 浏览

c# - ObservableCollection 和 BindingList 的区别

我想知道 和 之间的区别ObservableCollectionBindingList因为我已经使用两者来通知 Source 中的任何添加/删除更改,但我实际上不知道何时更喜欢其中一个。

为什么我会选择以下其中一项而不是另一项?

或者

0 投票
2 回答
532 浏览

c# - WPF 4键盘焦点:从不接收键事件

在 WPF 4.0 中,如果在加载后交换窗口中的用户控件,我似乎无法使用任何键盘快捷键。一个代码示例说了一千个单词,所以这就是我正在做的事情:

window获取 KeyDown 事件(并且路由命令工作正常),但从editor不获取任何键盘事件(其中也没有任何控件)。我试过:

......但这并没有做任何事情。EditorRoot扩展UserControl并有IsFocusable=true任何想法有什么问题吗?

0 投票
1 回答
2550 浏览

c# - 在 WPF 中更改动态创建的按钮的背景

我有以下代码来动态创建按钮并将其添加到面板:

问题是当我将鼠标光标移到按钮上时,它会恢复到以前的浅蓝色背景。现在,我已经读到我需要的是鼠标悬停按钮触发器,但我不知道如何仅针对这个按钮以编程方式执行此操作。基本上,我希望它的背景bgMouseOverBrush在鼠标光标在它上面时改变,然后bgBrush在它不在时改变。

0 投票
1 回答
9637 浏览

c# - 在 Aero 上的 WPF 中覆盖按钮背景

因此,愿望很简单,将按钮的背景更改为 LightGreen,鼠标光标悬停在其上时为绿色,按下时为 DarkGreen。以下 XAML 是我的第一次尝试:

但是,唉,这行不通。我们距离目标只有 1/3。是的,按钮变为浅绿色,但只要将鼠标悬停在它上面或按下它,您就会获得相应按钮状态的标准 Aero chrome。不想放弃,我尝试了以下放荡:

现在我们已经从Aero.NormalColor.xaml中取出了整个该死的控制模板。唉,这并没有改变。然后我开始从元素中删除两个属性 (RenderPressedRenderMouseOver) 。Microsoft_Windows_Themes:ButtonChrome不过,没有任何变化。然后我删除 Button 的Background属性设置,只留下 PresentationFramework.Aero 程序集的命名空间声明:

最后,我们取得了进展。我们已经从 1/3 的需求减少到 2/3,IsMouseOver 和 IsPressed 工作,但在按钮的正常状态(没有被鼠标悬停或按下)期间没有浅绿色背景,因为我已经删除了按钮的 Background 属性,以获取其他两种状态以应用并可见。现在,在这个疯狂的 XAML 未能为我们提供正常按钮状态的 LightGreen 背景之后,我修改了样式以将背景颜色也放入其中:

最后,它按预期工作。

我是不是疯了,或者这些(以及更多)你必须通过 Aero 主题来改变按钮的背景颜色在它的一些不同状态(正常、悬停、按下)?也许,如果我不必在其中包含整个 ButtonTemplate 只是为了从中删除两个属性 (RenderMouseOverRenderPressed),那么生活不会那么糟糕。

感谢您的帮助-我无能为力。

更新:但是等等还有更多。而不是从控件模板中删除 RenderMouseOver 和 RenderPressed 属性,只需将它们更改为:

到:

...,还解决了问题(忽略按钮的样式触发器)。我认为问题的根源在于模板绑定是在编译时应用的(出于性能原因),而常规绑定是在运行时应用的。因此,如果属性使用模板绑定(即使用原始模板中的 IsMouseOver 和 IsPressed),则不会使用来自单个按钮的样式触发器的绑定。

说了以上所有内容,下面是在 Aero 中更改按钮背景同时保留其原始控件模板的规范示例:

这当然是假设只有一个按钮具有这种样式,否则模板和样式可以移出到某处的资源部分。此外,按钮的默认状态没有触发器,但很容易将其添加到上面的示例中(不要忘记将控件模板中的 RenderDefaulted 属性更改为使用 Binding 而不是 TemplateBinding)。

如果有人对如何仅针对控件模板中需要更改的两个属性使用 Binding覆盖TemplateBinding 有任何建议,而无需从 aero xaml 批发中重复整个 chrome 定义,我会全力以赴。

0 投票
2 回答
1271 浏览

c# - 如何在按钮的控件模板中将 TemplateBindings 更改为 Bindings,而不重复整个控件模板

我想将处于正常、鼠标悬停和按下状态的按钮的背景颜色更改为各种绿色阴影。我被迫在Button.Template我的按钮中添加以下怪诞冗长的内容,以便我可以修改RenderMouseOverandRenderPressed属性以使用Binding而不是TemplateBinding,以便我的触发器(在 中Button.Style)实际上生效而不是由于TemplateBinding. 无论如何,对于 Aero 主题,是否可以更干净地覆盖这两个属性,而不是完全重复整个模板绑定?XAML 如下:

重要提示:控件模板仅对 Aero 主题是必需的。对于其他主题,仅使用 Button.Style 就可以完成这项工作。

0 投票
2 回答
5634 浏览

c# - wpf键盘焦点:菜单打开后失去焦点?

这看起来很容易,但它肯定没有按预期工作。在 WPF 4.0 中,我正在尝试创建一个带有接受键盘快捷键的菜单栏的窗口......只是一个简单的窗口,顶部的菜单栏和其他一些东西(在AvalonDock内,这可能是问题的一部分)。

有一个问题:菜单栏和内容在另一个用户控件中(我们称之为它SadPanda,因为它让我成为一个悲伤的熊猫),这是窗口的直接内容。逻辑层次结构看起来像这样(不是实际的 XAML):

窗口的内容需要访问窗口的句柄,所以它是在窗口加载后设置的,如下所示:

菜单栏和快捷方式已经路由了绑定到 SadPanda 的命令,当键盘焦点丢失时,输入手势不再起作用,因此是悲伤的熊猫。我添加了这个:

......似乎焦点正在回到窗口,而不是SadPanda本身。如果我在窗口上设置 Focusable="False",则焦点变为 null;甚至从未考虑过控制。我试过(评论中的 alpha-mouse 建议):

即使这样也不起作用——它会阻止菜单打开(它们闪烁打开一秒钟,然后消失)或文本框无法获得焦点......不知道为什么;这似乎是完美的解决方案。

基本上,我希望用户控件具有顶级键盘焦点,而不是窗口。实现这一目标的最简单方法是什么?

0 投票
7 回答
44156 浏览

wpf - 在 FullRow 选择模式下禁用 DataGrid 当前单元格边框

我在行选择模式下使用 DataGrid(即SelectionUnit="FullRow")。我只是想在用户突出显示一行时删除当前单元格周围的边框,以便进行真正的全行选择(并且没有单元格级别选择)。我不介意网格保持当前单元格的概念,我只想删除那个讨厌的当前单元格边框,也许是通过更改当前单元格的样式。最简单的方法是什么?

0 投票
2 回答
369 浏览

wpf - 将大量数据传递给用户控件

由于 WPF 中的 UserControls 必须具有无参数的构造函数,因此为它们提供相当复杂的数据的正确方法是“接近”构造时间所需的。我已经尝试为此使用依赖属性,但是遇到了 Visual Studio 设计器在尝试将诸如 a 之类的东西传递给Dictionary<string,MyObject>类型IDictionary<string,MyObject>化依赖属性时遇到的问题。在某些时候,它必须需要精确的编译时类型匹配,否则设计器中不会出现 XAML,尽管应用程序执行得很好。

基本上,我想要一种很好的方法来将通常会传递给构造函数的东西传递给用户控件。最好的方法是什么?

更新:有问题的用户控件将始终从 XAML 创建,因此除了无参数构造之外,还不能选择非无参数构造。

更新 2:一个有趣的想法是从无参数构造函数中访问一些东西,我可以从中获取我的初始化数据。可能会问这样一个问题:我已经初始化的祖先中的哪个实现了 IMyDataProvider 接口?这可能类似于相对源到祖先类型绑定的工作方式,除了从用户控件构造函数以编程方式完成。