Hi!
I have created a custom slider inherited from default UI Toolkit Slider. It works everything I want, but, when I toggle visibility option in builder or vie code - my control don’t respond and stays always visible.
Here is the full code of my custom slider, I think I need to somehow manually manage visibility toggle, but IDK how… Thanks in advance!
public class MDT_Slider : UnityEngine.UIElements.Slider
{
private VisualElement _filledTracker;
private VisualElement _dragger;
private VisualElement _tracker;
private float _minValue = 0;
private float _maxValue = 1;
public float MinValue
{
get => _minValue;
set
{
_minValue = value;
this.lowValue = value;
}
}
public float MaxValue
{
get => _maxValue;
set
{
_maxValue = value;
this.highValue = value;
}
}
public MDT_Slider() : base()
{
var dragContainer = this.Q<VisualElement>("unity-drag-container");
_dragger = this.Q<VisualElement>("unity-dragger");
_tracker = this.Q<VisualElement>("unity-tracker");
if (dragContainer != null)
{
_filledTracker = CreateTracker();
dragContainer.Add(_filledTracker);
dragContainer.Remove(_filledTracker);
// Вставляем элемент на новую позицию, ниже остальных элементов
dragContainer.Insert(0, _filledTracker);
}
this.RegisterCallback<ChangeEvent<float>>(OnValueChanged);
_filledTracker.RegisterCallback<GeometryChangedEvent>(OnGeometryChanged);
}
private void OnGeometryChanged(GeometryChangedEvent evt)
{
_filledTracker.style.width = _dragger.resolvedStyle.translate.x + _dragger.resolvedStyle.width / 2;
}
private void OnValueChanged(ChangeEvent<float> evt)
{
_filledTracker.style.width = _dragger.resolvedStyle.translate.x + _dragger.resolvedStyle.width/2;
}
public VisualElement CreateTracker()
{
var filledTracker = new VisualElement() { name = "filled_tracker",
style = { left = _tracker.resolvedStyle.left,
top = _tracker.resolvedStyle.top,
width = 0f} };
filledTracker.style.position = _tracker.resolvedStyle.position;
return filledTracker;
}
public new class UxmlFactory : UxmlFactory<MDT_Slider, UxmlTraits> { }
public new class UxmlTraits : VisualElement.UxmlTraits
{
UxmlFloatAttributeDescription attribute_minValue =
new UxmlFloatAttributeDescription { name = "minValue", defaultValue = 0f };
UxmlFloatAttributeDescription attribute_maxValue =
new UxmlFloatAttributeDescription { name = "maxValue", defaultValue = 10f };
public override void Init(VisualElement visual, IUxmlAttributes bag, CreationContext cc)
{
base.Init(visual, bag, cc);
var slider = visual as MDT_Slider;
slider.MinValue = attribute_minValue.GetValueFromBag(bag, cc);
slider.MaxValue = attribute_maxValue.GetValueFromBag(bag, cc);
}
}
}
}



