【问题标题】:Set a taskbar text different from the Window title in wpf在 wpf 中设置与窗口标题不同的任务栏文本
【发布时间】:2011-06-05 09:27:25
【问题描述】:

我在 C# 中使用 VS2010 进行开发,我想创建一个 WPF 窗口,它的任务栏文本与窗口标题不同。 属性 Title 设置窗口标题和任务栏文本。有没有办法分开设置?

【问题讨论】:

  • 当然这两个都设置了。您多久会看到一个应用程序的窗口标题栏和任务栏项目有不同的标题?你怎么知道任务栏项目对应于哪个窗口?
  • 一个原因是任务栏标题被截断,因此对于多个窗口可能最终相同。例如,如果窗口是“客户地址 - ABC Corporation”和“客户地址 - ABCDEFG Inc”,您可能会同时获得“客户地址 - ABC”。能够将其更改为“客户添加”会很好。所以重要的部分显示了。
  • ...当然,MSDN 建议首先要有区分位:“ABC Corporation - Customer Address”截断为“ABC Corporation - Customer Ad”之类的内容。这对截断有些意义,但在正常窗口标题上看起来很奇怪。

标签: c# wpf winapi


【解决方案1】:

首先,让我强调 Cody Gray 在他的回答和评论中所说的话 - 这是非标准行为,你应该有一个很好的理由这样做。

话虽如此,对于 Cody 的第 1 点,我会采取几乎相反的方法。我将创建一个设置为 None 的窗口 WindowStyle,并重新创建标题栏(其中可能包括图标、您的“伪标题”、最小化、最大化和关闭按钮,甚至可能是标准的 Windows 菜单。您还需要处理大小调整(可以通过将 ResizeMode 设置为 CanResizeWithGrip 来完成,但它会在窗口底部添加一个 Grip 控件,使其看起来与“正常”窗口略有不同)。

然后,此窗口的 Title 属性将是您要在任务栏中显示的 Title,而您创建的标题栏中的“伪标题”将只是一个 Label 或 TextBlock 绑定到您希望窗口显示的任何内容显示。

这有点复杂,但做起来真的不难。您可能会在此过程中遇到一些问题(例如,Window 在不同操作系统上的外观或应用了不同的 Windows 主题)。好消息是它不需要互操作,并且大部分可以仅使用 XAML 来实现。

网上有很多例子(here is one我随便挑的)。

同样,您必须决定是否值得努力创建非标准行为。 YMMV。

【讨论】:

  • 感谢您的回答,它工作得很好,而且很容易做到。我想指出,Microsoft 使 WPF Shell Integartion 自定义 windows chrome (code.msdn.microsoft.com/WPFShell)。但大部分功能仅适用于 Windows 7。
【解决方案2】:

基本上,您有两种选择:

  1. Draw the taskbar button yourself,而不是让 Windows 处理它。就所有者绘图而言,这实际上相当简单。

  2. 同时管理两个不同的窗体/窗口。您需要创建一个隐藏的主窗口,该窗口将显示在任务栏上并拥有您的第二个窗口。您的第二个窗口将可见,在其标题栏上显示自己的标题,并包含您的实际用户界面,但不会显示在任务栏上(将其ShowInTaskbar 属性设置为“False”)。每当使用任务栏激活第一个窗口时,您都必须编写代码来显示第二个窗口。

我建议您在开始使用这些路径中的任何一种之前,请仔细考虑您是否真的需要这种“功能”。如果您实际上在不同的地方拥有一个具有不同名称的窗口,那么就很难说出什么是什么。

【讨论】:

  • 感谢您的回答。第二点似乎很容易做到(我喜欢这个主意),但我不想有两个窗口。关于第二点,你知道在wpf c#中怎么做吗?我不知道如何覆盖 IsIconic 方法,我担心 wpf 中没有窗口句柄。
  • @Nicolas:作为 WPF 程序员,我并没有真正的优势,但 WindowInteropHelper class 允许您与非托管 Windows API 进行互操作。具体来说,它的Handle property 将为窗口返回hWnd。第一个建议的风险在于它可能无法在从根本上改变任务栏的较新版本的 Windows(如 7)上正常工作。我显然没有测试过。
  • @Nicolas 选项 2 非常不容易。 @Cody 是正确的,您需要在任务栏操作时显示和隐藏第二个窗口。您还需要处理预览缩略图,我怀疑这将是一个过分的桥梁。 Delphi 应用程序以前使用选项 2,因此允许 tasbar 和主窗体标题不同,但当 Vista 出现时,他们停止这样做。更重要的是,与主窗口和假窗口无法正确同步有关的错误接踵而至。我的建议是顺其自然并保持标题不变。
【解决方案3】:

尝试使用这个: http://www.codeguru.com/forum/showthread.php?t=3833 和这个结合 http://social.msdn.microsoft.com/Forums/en-US/wpf/thread/6b97a6de-0480-4339-8ed0-cb7cdb27bd83

当我制作没有标题栏的窗口并希望在任务栏图标中添加一些文本时,第一个在经典的 .NET 表单应用程序中对我来说很好。 第二个您需要在 WPF 窗口中处理低级 WIN32 消息(但这仅适用于顶级之一)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-01-27
    • 2012-04-16
    • 2010-09-16
    • 2017-02-22
    • 1970-01-01
    • 2010-10-20
    • 2013-08-22
    • 2011-11-12
    相关资源
    最近更新 更多