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