Самое быстрое решение - установить MinWidth="33"
на "PART_Indicator"
- MinWidth
, который имеет приоритет над Width
, поэтому эллипс всегда будет полностью виден.Недостатком этого подхода является то, что эллипс будет оставаться «неподвижным» до тех пор, пока значение не станет достаточно высоким, чтобы общая ширина индикатора превышала ширину эллипса (я думаю, что это было 5 в вашем случае), что я считаю нежелательным.
Ключом к решению является перемещение эллипса за пределы "PART_Indicator"
, как упоминалось @GenericTeaCup.Идея состоит в том, чтобы установить горизонтальное поле для линейки и индикатора, равное половине ширины эллипса, так, чтобы его левая и правая стороны находились точно под центральной точкой эллипса, когда значение соответственно минимальное и максимальное.Таким образом, мы можем легко перемещать эллипс по фактической ширине индикатора и всегда располагать его в том месте, где мы хотим его видеть (по центру непосредственно над правой стороной индикатора).Теперь я не уверен, каковы ваши точные ожидания относительно начала и конца трек-бара, поэтому я дам вам два варианта, которые я считаю наиболее распространенными.
Первый из них выглядит следующим образом (я добавилнекоторая прозрачность эллипса, чтобы разница была отчетливо видна):


Этот шаблон должен давать изображенный результат:
<ControlTemplate TargetType="{x:Type ProgressBar}">
<Grid x:Name="TemplateRoot">
<Rectangle x:Name="LeftFill" Height="5.5" Width="17" HorizontalAlignment="Left" VerticalAlignment="Center" Fill="{TemplateBinding Foreground}" SnapsToDevicePixels="True" />
<Rectangle x:Name="RightFill" Height="5.5" Width="17" HorizontalAlignment="Right" VerticalAlignment="Center" Fill="{TemplateBinding Background}" SnapsToDevicePixels="True" />
<Rectangle x:Name="PART_Track" Height="5.5" Margin="16.5,0" HorizontalAlignment="Stretch" VerticalAlignment="Center" Fill="{TemplateBinding Background}" SnapsToDevicePixels="True" />
<Rectangle x:Name="PART_Indicator" Height="5.5" Margin="16.5,0" HorizontalAlignment="Left" VerticalAlignment="Center" Fill="{TemplateBinding Foreground}" SnapsToDevicePixels="True" />
<Ellipse Width="33" Height="33" HorizontalAlignment="Left" VerticalAlignment="Center" Fill="{TemplateBinding Foreground}" Stretch="Fill" SnapsToDevicePixels="True">
<Ellipse.RenderTransform>
<TranslateTransform X="{Binding Source={x:Reference PART_Indicator}, Path=ActualWidth}" />
</Ellipse.RenderTransform>
</Ellipse>
<Border BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" CornerRadius="2" SnapsToDevicePixels="True" />
</Grid>
</ControlTemplate>
Второй вариант:


Чтобы получить его, вам просто нужно удалить "LeftFill"
и "RightFill"
из шаблона.Обратите внимание, что трекбар будет иметь отступ по отношению к самому ProgressBar
.
Если вам неудобно использовать RenderTransform
на эллипсе, вы можете поместить его в Canvas
и связать Canvas.Left
свойство вместо.