Ich habe einen WPF-Schieberegler, dessen minimaler Wert = 0 und maximaler Wert = 50. Ich möchte Ticks in einem Intervall von 5 anzeigen. aber lassen Sie den Schieberegler in einem Intervall von 1 einrasten. Ist das überhaupt möglich?Wie man an den Werten auf einem WPF-Slider einrastet, aber nur ein Häkchen für einige von ihnen zeigt
Antwort
Die Eigenschaft Interval
hat keine Auswirkungen auf dieses Verhalten. diese
Verwendung:
<Slider TickFrequency="5" IsSnapToTickEnabled="True" />
<Slider TickPlacement="TopLeft" Minimum="0" Maximum="50" TickFrequency="5" IsSnapToTickEnabled="False" SmallChange="1" />
deaktivieren Fangen von Zecken mit IsSnapToTickEnabled="False"
und setzen SmallChange="1"
.
SmallChange bestimmt die Schrittweite beim Ziehen des Daumens oder Drücken der Pfeiltasten. Sie können das Inkrement auch steuern, wenn der Benutzer auf den Schieberegler (nicht auf den Daumen) klickt. Um den Daumen zu springen, verwenden Sie LargeChange="10"
, um 10 Einheiten zu überspringen. Um den Schieberegler dahin zu verschieben, wo der Benutzer geklickt hat, verwenden Sie IsMoveToPointEnabled="True"
. Hinweis: IsMoveToPointEnabled setzt den Daumen auf das nächste SmallChange-Inkrement.
'SmallChange' beeinflusst das Ziehen des Daumens überhaupt nicht. Also diese Lösung funktioniert nicht. –
Der normale WPF Slider
kann nur alle oder keine Markierungen zeichnen.
Um diese Einschränkung zu umgehen, können Sie entweder Ihre eigenen Slider
erstellen oder Sie können einen Trick verwenden: Deaktivieren Sie die Slider
TickBar
und zeichnen Sie Ihre eigenen.
<StackPanel>
<TickBar Maximum="{Binding Path=Maximum, ElementName=MySlider}"
Minimum="{Binding Path=Minimum, ElementName=MySlider}" TickFrequency="5" Height="4"
Fill="Black" ReservedSpace="11" />
<Slider Name="MySlider" Maximum="50" TickPlacement="None" IsSnapToTickEnabled="True" />
</StackPanel>
ReservedSpace
ist das kombinierte Feld nach links und rechts von den äußersten Zecken, die genau das gleiche wie die Thumb
‚s breit ist. Es ist normalerweise 11 Pixel. Wenn Sie ein ungewöhnliches Thema verwenden oder es auf andere Weise durcheinander bringen, müssen Sie es auch in Ihrem neuen TickBar
anpassen.
Diese Lösung hat einen Nachteil: Der Thumb
wird nicht spitz sein, weil der Slider
denkt, dass er keine Häkchen hat. Wenn Sie die Thumb
seine spitzen wollen, müssen Sie die Slider
Trick von ihm ein TickBar
geben und es dann später kollabieren:
<StackPanel>
<TickBar Maximum="{Binding Path=Maximum, ElementName=MySlider2}"
Minimum="{Binding Path=Minimum, ElementName=MySlider2}" TickFrequency="5"
Height="4" Fill="Black" ReservedSpace="11" />
<Slider Name="MySlider2" Maximum="50" TickPlacement="TopLeft"
IsSnapToTickEnabled="True"/>
</StackPanel>
Und dann in Ihrem Window
‚s Konstruktor (nach InitializeComponent()
):
this.Loaded += (sender, e) =>
{
var sliderTickBar = (MySlider2.Template.FindName("TopTick", MySlider2) as
System.Windows.Controls.Primitives.TickBar);
sliderTickBar.Visibility = Visibility.Collapsed;
};
Ich löste das gleiche Problem, indem ich nur die Ticks anzeigte, die ich wollte, indem ich die Ticks-Eigenschaft setzte, IsSnapToTickEnabled auf false setzte und die Bindung des Slider-Werts runderte. In meinem Beispiel möchte ich den Schieberegler für 0 bis 100% anzeigen, Ticks in 5% -Schritten anzeigen und den Schritt auf 1% setzen.
Die XAML:
<Slider Minimum="0" Maximum="100"
TickPlacement="BottomRight" Ticks="{Binding PercentTicks}"
TickFrequency="1" SmallChange="1" LargeChange="5"
Value="{Binding MyProperty, Converter={StaticResource PercentageConverter}}" />
Die Ansicht Modell:
public double MyProperty
{
get { return myProperty; }
set
{
myProperty = Math.Round(value, 2);
OnPropertyChanged();
}
}
myProperty Wert von 0 bis 1, so zu 2 Ziffern Rundung ergibt genau 1% Schritt!
var ticks = new DoubleCollection();
for (int i = 0; i <= 100; i+=5)
{
ticks.Add(i);
}
PercentTicks = ticks;
arbeitet Dies gilt nicht: die Zecken auf 5% -Schritten Einstellung wird in dem View-Modell Konstruktor getan. Es ist nicht möglich, jetzt mit einer anderen Frequenz als 5 zu schnappen. –