【问题标题】:WPF behaves like Taskbar [duplicate]WPF 的行为类似于任务栏 [重复]
【发布时间】:2019-02-06 13:55:27
【问题描述】:

我在工作中需要类似 WPF 股票行情的应用程序。 我想以此为起点:http://www.jarloo.com/rumormill4

但它没有做的一件事是停靠到桌面窗口的顶部 - 并且 - 按下任何其他窗口,最大化或以其他方式。此应用必须在屏幕顶部拥有一小块垂直空间,全宽。我搜索了 WPF 帖子,但找不到示例。我见过第三方解决方案,所以我知道这是可能的。 Window.Topmost 几乎实现了这种行为,但只是覆盖/掩盖了它下面的任何东西。有什么建议? 下图演示了当前行为。 WPF 窗口位于 VS 之上,这是个问题。

【问题讨论】:

  • 您能否通过屏幕截图(您想要的)提出问题并发布您尝试的代码/xaml?该链接没有说明太多问题,我们无法调试“单词”。什么是“顶部”或“股票行情”?自定义任务栏?
  • 是的,我的错误是搜索条件。在屏幕上保留一个区域是我所追求的。我认为这会奏效。非常感谢
  • 谷歌“wpf shappbarmessage”找到你需要的代码。热门歌曲是 2008 年的 SO question

标签: c# wpf


【解决方案1】:

将您的 XAML 设置如下:

<Window x:Class="WpfApp.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        mc:Ignorable="d"
        WindowStartupLocation="Manual"
        Title="MainWindow" SizeToContent="Height" ResizeMode="NoResize" Topmost="True"
        WindowState="Maximized">
    <Grid>
        <TextBlock Text="Hi there!" FontSize="36"/>
    </Grid>
</Window>

我们设置SizeToContent = Height来实现高度自动效果。 WindowState=Maximized 实现窗口的全宽。

然后在代码隐藏中使用以下代码来避免用户移动窗口:

public partial class MainWindow
    {
        const int WM_SYSCOMMAND = 0x0112;
        const int SC_MOVE = 0xF010;

        public MainWindow()
        {
            InitializeComponent();

            SourceInitialized += OnSourceInitialized;
            Left = 0;
            Top = 0;
        }

        private void OnSourceInitialized(object sender, EventArgs e)
        {
            var helper = new WindowInteropHelper(this);
            var source = HwndSource.FromHwnd(helper.Handle);
            source.AddHook(WndProc);
        }

        private static IntPtr WndProc(IntPtr hwnd, int msg, IntPtr wParam, IntPtr lParam, ref bool handled)
        {

            switch (msg)
            {
                case WM_SYSCOMMAND:
                    int command = wParam.ToInt32() & 0xfff0;
                    if (command == SC_MOVE)
                    {
                        handled = true;
                    }
                    break;
                default:
                    break;
            }
            return IntPtr.Zero;
        }
    }

我必须说我从@Thomas Levesque 的this answer 中截取了最后一部分。

结果是一个漂亮的全宽顶部停靠窗口

【讨论】:

  • 这绝对会阻止用户移动窗口。这很好,但它不保留它的区域。因此,另一个应用程序可能会被此窗口遮挡。我需要任何其他窗口(WPF 应用程序之外)来尊重该区域的位置,而不是填充它下面的区域。
  • 嗨,Michael K,我正在尝试实现类似的目标,想知道您是否找到了解决方案。如果是的话,如果您能与社区分享,将不胜感激。在此先感谢:)
猜你喜欢
  • 2011-10-11
  • 1970-01-01
  • 1970-01-01
  • 2019-01-29
  • 2019-10-10
  • 1970-01-01
  • 1970-01-01
  • 2012-03-02
  • 2020-08-31
相关资源
最近更新 更多