微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

GtkSharp - Window.Opacity 在显示窗口时被忽略

如何解决GtkSharp - Window.Opacity 在显示窗口时被忽略

在 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,我想避免使用“快速”超时的解决方法,以便在开始时快速隐藏它,以避免闪烁。

解决方法

一个相当不错的解决方案(适用于 Windows 和 Linux 平台)是在主窗口内(通过 Widget.Opacity 界面)为主容器(例如 GtkBox )控件的 Widget 设置动画.

对于带有 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) 上测试。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。