【问题标题】:Gtk 3.24 - slide button in GtkSharpGtk 3.24 - GtkSharp 中的滑动按钮
【发布时间】:2022-11-05 16:22:02
【问题描述】:

我正在为 Gtk 3.24 使用 GtkSharp C# 绑定,而且我是 Gtk 世界的新手。我需要做的是一种特殊的按钮,如下图所示。通过将绿色部分向右移动来激活该按钮。如果移动在到达右边缘之前结束,则滑块将返回到左侧。该小部件通过触摸面板进行操作。

我尝试通过 CSS 自定义最接近我要求的 Gtk.Switch 小部件,但在这里我没有设法摆脱它的 Click 事件,该事件允许通过单击鼠标/手指来切换按钮。我也不喜欢切换阈值正好是小部件的 50%。

另一种可能性是自定义 Gtk.Scale 小部件,或者从头开始创建小部件?

请您向我推荐一些实现此类按钮的简单方法吗?

【问题讨论】:

    标签: c# gtk3 gtk#


    【解决方案1】:

    最后我从这个article 中获得了灵感。方法很简单:

    • 自定义组件派生自Gtk.Fixed 容器,该容器允许对其元素进行绝对定位。
    • 滑块(背景)的静态部分是Gtk.Image,位于左上角。
    • 滑块是Gtk.Button 组件,里面有自定义图像。
    • 组件侦听ButtonPressEvent 并存储初始触摸位置。 ButtonReleaseEvent 用于评估按钮移动完成的位置,最后MotionNotifyEvent 处理滑块位置的变化。

    【讨论】:

      【解决方案2】:

      我将通过创建一个自定义的 Switch 派生小部件、覆盖 OnDrawn () 方法并实现我自己的小部件渲染来解决这个问题,该渲染响应开关是处于打开还是关闭位置。就您想要的行为而言,Switch 可能是最接近的小部件;只是渲染不一样。像这样的东西:

      public class MySliderSwitch : Gtk.Switch
      {
      
        ...
      
        protected override bool OnDrawn (Cairo.Context context)
        {
          // draw your widget using the given Cairo Context.
          // this is just an example drawing a rectangle.
          context.LineWidth = 2.0F;
          context.Rectangle (0, 0, AllocatedWidth, AllocatedHeight);
          context.SetSourceRgb (0, 0, 0);
          context.StrokePreserve ();
          context.SetSourceRgb (1, 0, 0);
          context.Fill ();
      
          return true;
        }
      
        ...
      
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-03-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-08-14
        相关资源
        最近更新 更多