问题描述
在 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) 上测试。