GtkSharp-窗口.显示窗口时会忽略不透明度



在Windows平台上使用GtkSharp和.Net Core项目:

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

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

计时器处理程序对此属性的连续更新工作正常("不透明度"值将更新,屏幕上窗口的实际不透明度将随之更新(。它只是忽略了第一次显示窗口时的"不透明度"。

我尝试从Shown处理程序、Window.Show((之前、Window.Sow((之后以及其他一些处理程序中设置"不透明度"-尽管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接口(动画化主容器(例如GtkBox(控件的Widget.Opacity

Opacity在所有情况下都能像GtkSharp的控件一样工作。例如:

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(上测试。

最新更新