【问题标题】:GtkSharp - Window.Opacity is ignored while showing the windowGtkSharp - Window.Opacity 在显示窗口时被忽略
【发布时间】:2021-04-05 21:13:00
【问题描述】:

在 Windows 平台上将 GtkSharp 与 .Net Core 项目一起使用:

<PackageReference Include="GtkSharp" Version="3.24.24.4" />

我正在尝试模拟淡入简单的动画。在 Window 构造函数中,Opacity 设置为 0.1,然后设置一个计时器以保持将其增加到 1。 现在,尽管属性 Window.Opacity 的值是正确的(第一次调用 timout 处理程序,它是 0.1,在构造函数中设置),开始时的窗口始终显示为完全不透明(就像在构造函数中设置的值被忽略) .

定时器处理程序对该属性的连续更新工作正常(不透明度值被更新,屏幕上窗口的实际不透明度如下)。它只是忽略不透明度,如果窗口的第一个显示。

我尝试从 Shown 处理程序中设置不透明度,在 Window.Show() 之前,在 Window.Show() 之后和其他几个 - 尽管Opacity 属性的值设置为,但它在构造后始终可见并以完全不透明度显示0.1(或任何其他值 >= 0)。在 .glade 文件中设置时,它会以同样的方式忽略它。

public class MainWindow : Window
        {
    
            public MainWindow() : this(new Builder("MainWindow.glade")) { }
            private MainWindow(Builder builder) : base(builder.GetObject("MainWindow").Handle)
            {
    
                builder.Autoconnect(this);          
    
                Opacity = 0.1;
                GLib.Timeout.Add(2000, new GLib.TimeoutHandler(fadein_timeout));
            }
    
            bool fadein_timeout()
            {
                this.Opacity += 0.1;   // first time here, value of Opacity is 0.1 (as expected), but windows is shown with 100% opacity (unexpected)
                if (Opacity >= 1.0)
                    return false;
                return true;
            }
}

知道如何让它工作吗? Ofc,我想避免使用“快速”超时来快速隐藏它,以避免闪烁。

【问题讨论】:

  • 你正在处理的是Window的show-window-animation。在窗口完全实现之前,Windows 会快速淡入。这是操作系统级别的事情。您可能必须将其从 TopLevel 窗口更改为其他窗口(工具窗口?对话框?)才能停止这样做。无论你最终做什么都可能很笨拙。

标签: c# gtk# gtk2


【解决方案1】:

一个相当不错的解决方案(适用于 Windows 和 Linux 平台)是在主窗口内(通过 Widget 接口)对主容器(例如 GtkBox )控件的 Widget.Opacity 进行动画处理。

对于带有 GtkSharp 的控件小部件,Opacity 在所有情况下都可以正常工作。例如:

    public class MainWindow : Window
    {
        [UI] Widget _mainBox = null; // this is the main container control, e.g. GtkBox

        public MainWindow() : this(new Builder("MainWindow.glade")) { }
        private MainWindow(Builder builder) : base(builder.GetObject("MainWindow").Handle)
        {

            builder.Autoconnect(this);          

            _mainBox.Opacity = 0.1;
            GLib.Timeout.Add(50, new GLib.TimeoutHandler(fadein_timeout));
        }

        bool fadein_timeout()
        {
            _mainBox.Opacity += 0.01;   
            if (_mainBox.Opacity >= 1.0)
                return false;
            return true;
        }
  }

在 Windows 10 和纯 X11 (Linux Arm) 上测试。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-01-16
    • 2011-07-16
    • 1970-01-01
    • 2011-05-11
    • 2018-10-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多