问题 设置与wpf中的Window标题不同的任务栏文本


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


3853
2018-01-07 16:31


起源

当然它设置了它们。您经常看到一个应用程序的窗口标题栏和任务栏项目有不同的标题?你怎么知道任务栏项对应哪个窗口? - Cody Gray♦
原因是任务栏标题被截断,因此对于几个窗口可能会相同。例如,如果窗口是“客户地址 - ABC公司”和“客户地址 - ABCDEFG公司”,您可能会获得“客户地址 - ABC”。能够将其更改为“客户添加”会很高兴。所以重要的部分表明。 - James_UK_DEV
...当然,MSDN的建议是首先区分位:“ABC公司 - 客户地址”截断为“ABC公司 - 客户广告”。这对截断有一定意义,但在普通窗口标题上看起来很奇怪。 - James_UK_DEV


答案:


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

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

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

这有点复杂,但实际上并不难做到。您可能会遇到一些问题(例如,Window在不同操作系统上的应用程序或应用了不同的Windows主题)。好处是它不需要Interop,并且大部分只能使用XAML来实现。

网上有很多例子(这是一个 我随机挑选了)。

同样,您必须决定是否值得创建非标准行为。因人而异。


7
2018-01-07 18:31



谢谢你的回答,它很好用而且很容易做到。我想说明微软让WPF Shell Integartion定制windows chrome(code.msdn.microsoft.com/WPFShell)。但大多数功能仅适用于Windows 7。 - Nicolas
WPFShell上的好点。 - Wonko the Sane


基本上,您有两种选择:

  1. 自己绘制任务栏按钮而不是让Windows处理它。这实际上相当简单,只要所有者绘制的东西。

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

我建议在开始使用其中一个路径之前,仔细考虑是否真的需要这个“功能”。如果你在不同的地方拥有一个有不同名字的窗口,那么很难说清楚会发生什么。


4
2018-01-07 17:12



感谢您的回答。第二点似乎很容易做到(我喜欢这个想法),但我不想有两个窗口。关于第二点,你知道如何在wpf c#中做到这一点吗?我不知道如何覆盖IsIconic方法,我担心wpf中没有窗口句柄。 - Nicolas
@Nicolas:作为WPF程序员,我真的没有翅膀,但是 WindowInteropHelper 类 允许您与非托管Windows API互操作。具体来说,它 Handle 属性 将返回 hWnd 对于一个窗口。第一个建议的风险是,它可能无法在从根本上改变任务栏的较新版本的Windows(如7)上正常工作。我显然没有测试过它。 - Cody Gray♦
@Nicolas Option 2非常不容易。 @Cody是正确的,您需要在任务栏操作时显示和隐藏第二个窗口。您还需要处理预览缩略图,我怀疑它将成为一个太过分的桥梁。 Delphi应用程序以前使用选项2,因此允许tasbar和主要表单字幕不同,但当Vista出来时,他们停止这样做。更糟糕的是,在与主窗口相关的错误和假窗口未正确同步之后出现了错误。我的建议是滚动并保持字幕相同。 - David Heffernan


试着用这个: 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消息的第二个(但这仅适用于顶级一级)。


1
2018-03-03 20:47