{"record":{"id":"52b74bae45339ecd","repo":"stride3d/stride","slug":"the-associated-slider-must-have-a-track-child-named-part","errorCode":null,"errorMessage":"The associated slider must have a Track child named 'PART_Track'","messagePattern":"The associated slider must have a Track child named 'PART_Track'","errorType":"exception","errorClass":"InvalidOperationException","httpStatus":null,"severity":"error","filePath":"sources/presentation/Stride.Core.Presentation.Wpf/Behaviors/SliderDragFromTrackBehavior.cs","lineNumber":46,"sourceCode":"        protected override void OnDetaching()\n        {\n            AssociatedObject.Initialized -= SliderInitialized;\n            AssociatedObject.RemoveHandler(UIElement.PreviewMouseLeftButtonDownEvent, (MouseButtonEventHandler)TrackMouseEvent);\n            AssociatedObject.RemoveHandler(UIElement.PreviewMouseLeftButtonUpEvent, (MouseButtonEventHandler)TrackMouseEvent);\n            if (track != null && track.Thumb != null)\n            {\n                track.Thumb.MouseEnter -= MouseEnter;\n            }\n            base.OnDetaching();\n        }\n\n        private void SliderInitialized(object sender, EventArgs e)\n        {\n            AssociatedObject.ApplyTemplate();\n\n            track = AssociatedObject.FindVisualChildOfType<Track>();\n            if (track == null || track.Name != \"PART_Track\")\n                throw new InvalidOperationException(\"The associated slider must have a Track child named 'PART_Track'\");\n            track.Thumb.MouseEnter += MouseEnter;\n            AssociatedObject.Initialized += SliderInitialized;\n        }\n\n        private void TrackMouseEvent(object sender, [NotNull] MouseButtonEventArgs e)\n        {\n            if (e.ChangedButton == MouseButton.Left)\n                trackMouseDown = e.ButtonState == MouseButtonState.Pressed;\n        }\n\n        private void MouseEnter(object sender, [NotNull] MouseEventArgs e)\n        {\n            if (trackMouseDown)\n            {\n                var args = new MouseButtonEventArgs(e.MouseDevice, e.Timestamp, MouseButton.Left) { RoutedEvent = UIElement.MouseLeftButtonDownEvent };\n                track.Thumb.RaiseEvent(args);\n                trackMouseDown = false;\n            }","sourceCodeStart":28,"sourceCodeEnd":64,"githubUrl":"https://github.com/stride3d/stride/blob/96fad776d210c221682aac1ccdf4c79dc046fc38/sources/presentation/Stride.Core.Presentation.Wpf/Behaviors/SliderDragFromTrackBehavior.cs#L28-L64","documentation":"SliderDragFromTrackBehavior lets users start dragging the slider thumb by clicking anywhere on the slider's track. In SliderInitialized it applies the template and looks for a Track visual child; if none is found or the found track is not named 'PART_Track', it throws InvalidOperationException because dragging cannot be wired up without the standard slider Track part.","triggerScenarios":"Attaching the behavior to a custom slider whose ControlTemplate does not include a Track named PART_Track, or whose template hasn't produced a Track visual child after ApplyTemplate; attaching before/during template application such that FindVisualChildOfType<Track> runs too early in some custom templates.","commonSituations":"Using a custom or third-party slider style that renamed or removed PART_Track; building a minimal slider template for a lightweight look without a Track; attaching the behavior to a control that isn't actually a slider template host.","solutions":["Restore a <Track x:Name=\"PART_Track\"/> element in the slider's ControlTemplate (standard Slider templates always include it).","Ensure the Track's name is exactly PART_Track — the check is case-sensitive and name-based.","Verify the behavior is attached to a Slider that actually loads that template (correct Template/Style applied, not a fallback).","If the template can't change, remove the behavior or implement track-click handling without this behavior."],"exampleFix":"<!-- before: custom template without a Track part -->\n<ControlTemplate TargetType=\"Slider\">\n  <Border Background=\"{TemplateBinding Background}\" />\n</ControlTemplate>\n\n<!-- after -->\n<ControlTemplate TargetType=\"Slider\">\n  <Track x:Name=\"PART_Track\" Value=\"{TemplateBinding Value}\">\n    <Track.Thumb>\n      <Thumb />\n    </Track.Thumb>\n  </Track>\n</ControlTemplate>","handlingStrategy":"validation","validationCode":"slider.ApplyTemplate();\nvar track = slider.FindVisualChildOfType<Track>();\nif (track == null || track.Name != \"PART_Track\")\n    log.Warn(\"Slider template lacks PART_Track; SliderDragFromTrackBehavior will throw.\");","typeGuard":"static bool HasSliderTrackPart(Slider s) { s.ApplyTemplate(); var t = s.FindVisualChildOfType<Track>(); return t?.Name == \"PART_Track\"; }","tryCatchPattern":"try { behavior.Attach(slider); }\ncatch (InvalidOperationException ex) when (ex.Message.Contains(\"PART_Track\")) { log.Error(\"Slider template must include <Track x:Name='PART_Track'/>\"); }","preventionTips":["Base custom slider styles on the default Slider template so PART_Track is preserved.","Never rename or remove the PART_Track part in a custom template.","Smoke-test custom-styled sliders with this behavior attached before shipping themes."],"tags":["wpf","template","slider","behavior"],"backgroundTag":"resource-not-found","analyzedSha":"96fad776d210c221682aac1ccdf4c79dc046fc38","analyzedAt":"2026-09-14T02:59:31.279Z","contentChangedAt":"2026-09-14T02:59:31.279Z","schemaVersion":2},"datasetVersion":"2026-09-15T23:17:13.987Z"}