Partial Public Class RangeSlider
Inherits UserControl
Implements ComponentModel.INotifyPropertyChanged
Public Sub New()
' Dieser Aufruf ist für den Designer erforderlich.
InitializeComponent()
' Fügen Sie Initialisierungen nach dem InitializeComponent()-Aufruf hinzu.
Me.DataContext = Me
End Sub
Public Shared ReadOnly MinimumProperty As DependencyProperty = DependencyProperty.Register("Minimum", GetType(Double), GetType(RangeSlider), New UIPropertyMetadata(0.0))
Public Shared ReadOnly LowerValueProperty As DependencyProperty = DependencyProperty.Register("LowerValue", GetType(Double), GetType(RangeSlider), New UIPropertyMetadata(0.0))
Public Shared ReadOnly UpperValueProperty As DependencyProperty = DependencyProperty.Register("UpperValue", GetType(Double), GetType(RangeSlider), New UIPropertyMetadata(0.0))
Public Shared ReadOnly MaximumProperty As DependencyProperty = DependencyProperty.Register("Maximum", GetType(Double), GetType(RangeSlider), New UIPropertyMetadata(1.0))
Public Shared ReadOnly IntervallProperty As DependencyProperty = DependencyProperty.Register("Intervall", GetType(Integer), GetType(RangeSlider), New UIPropertyMetadata())
Public Property Minimum As Double
Get
Return CDbl(GetValue(MinimumProperty))
End Get
Set(value As Double)
SetValue(MinimumProperty, value)
End Set
End Property
Public Property LowerValue As Double
Get
Return CDbl(GetValue(LowerValueProperty))
End Get
Set(value As Double)
SetValue(LowerValueProperty, value)
Propertychange("LowerValue")
End Set
End Property
Public Property UpperValue As Double
Get
Return CDbl(GetValue(UpperValueProperty))
End Get
Set(value As Double)
SetValue(UpperValueProperty, value)
End Set
End Property
Public Property Maximum As Double
Get
Return CDbl(GetValue(MaximumProperty))
End Get
Set(value As Double)
SetValue(MaximumProperty, value)
End Set
End Property
Public Property Intervall As Integer
Get
Return Convert.ToInt32(GetValue(IntervallProperty))
End Get
Set(value As Integer)
End Set
End Property
Private Sub LowerSlider_ValueChanged(sender As System.Object, e As System.Windows.RoutedPropertyChangedEventArgs(Of System.Double)) Handles LowerSlider.ValueChanged
UpperSlider.Value = Math.Max(UpperSlider.Value, LowerSlider.Value)
End Sub
Private Sub UpperSlider_ValueChanged(sender As System.Object, e As System.Windows.RoutedPropertyChangedEventArgs(Of System.Double)) Handles UpperSlider.ValueChanged
LowerSlider.Value = Math.Min(UpperSlider.Value, LowerSlider.Value)
End Sub
Public Event PropertyChanged(sender As Object, e As System.ComponentModel.PropertyChangedEventArgs) Implements System.ComponentModel.INotifyPropertyChanged.PropertyChanged
Private Sub Propertychange(ByVal Name As String)
RaiseEvent PropertyChanged(Me, New System.ComponentModel.PropertyChangedEventArgs(Name))
End Sub
End Class
versuch ich auch schon die ganze zeit leider funktioniert das irgendwie nicht, ich muss dazu sagen mein Slider ist ein eigenes UserControl muss man beim Binden an Dependency Properties irgendwas beachten?
Ich hab folgendes Problem : Ich muss auf eine Textbox einen Wert Binden.
Nur muss gleichzeitig die Textbox TwoWay auf einen Slider gebunden sein.
So dass die Textbox wenn vorhanden einen Startwert bekommt (aus der Datenbank) und dieser automatisch auf den Slider gebunden wird. Sich aber auch ändert wenn er auf dem Slider geändert wird.
Hab aktuell schon paar Sachen ausprobiert aber komme nicht zu einem Erfolg, ich google jetzt weiter eventuell hat ja jemand von euch Erfahrung damit. Geht das überhaupt?
also folgendes : Ich habe mir dieses Steuerelement gebaut den RangeSlider jetzt soll folgende funktionalität hinzukommen.
Wenn eine Zeitspanne gegeben ist (Von - Bis) und dazu ein Intervall wie oft dieser Dienst (Von - Bis) in diesem Zeitraum ausgeführt werden soll, soll ermittelt werden wie oft dieses Intervall in diese Zeitspanne hinein passt, um dann auf der TimeLine zwischen den Abständen (Von - Bis) das Intervall exakt auf der TimeLine zu platzieren
Partial Public Class RangeSlider
Inherits UserControl
Public Sub New()
' Dieser Aufruf ist für den Designer erforderlich.
InitializeComponent()
' Fügen Sie Initialisierungen nach dem InitializeComponent()-Aufruf hinzu.
End Sub
Public Shared ReadOnly MinimumProperty As DependencyProperty = DependencyProperty.Register("Minimum", GetType(Double), GetType(RangeSlider), New UIPropertyMetadata(0.0))
Public Shared ReadOnly LowerValueProperty As DependencyProperty = DependencyProperty.Register("LowerValue", GetType(Double), GetType(RangeSlider), New UIPropertyMetadata(0.0))
Public Shared ReadOnly UpperValueProperty As DependencyProperty = DependencyProperty.Register("UpperValue", GetType(Double), GetType(RangeSlider), New UIPropertyMetadata(0.0))
Public Shared ReadOnly MaximumProperty As DependencyProperty = DependencyProperty.Register("Maximum", GetType(Double), GetType(RangeSlider), New UIPropertyMetadata(1.0))
Public Property Minimum As Double
Get
Return CDbl(GetValue(MinimumProperty))
End Get
Set(value As Double)
SetValue(MinimumProperty, value)
End Set
End Property
Public Property LowerValue As Double
Get
Return CDbl(GetValue(LowerValueProperty))
End Get
Set(value As Double)
SetValue(LowerValueProperty, value)
End Set
End Property
Public Property UpperValue As Double
Get
Return CDbl(GetValue(UpperValueProperty))
End Get
Set(value As Double)
SetValue(UpperValueProperty, value)
End Set
End Property
Public Property Maximum As Double
Get
Return CDbl(GetValue(MaximumProperty))
End Get
Set(value As Double)
SetValue(MaximumProperty, value)
End Set
End Property
Private Sub LowerSlider_ValueChanged(sender As System.Object, e As System.Windows.RoutedPropertyChangedEventArgs(Of System.Double)) Handles LowerSlider.ValueChanged
UpperSlider.Value = Math.Max(UpperSlider.Value, LowerSlider.Value)
End Sub
Private Sub UpperSlider_ValueChanged(sender As System.Object, e As System.Windows.RoutedPropertyChangedEventArgs(Of System.Double)) Handles UpperSlider.ValueChanged
LowerSlider.Value = Math.Min(UpperSlider.Value, LowerSlider.Value)
End Sub
End Class
Kann mir vllt jemand auf die Sprünge helfen? Ich bekomme durch das Beispiel leider den RangeSlider nicht erstellt bzw. bei meinem Versuch kann die Instanz nicht erstellt werden.
Hab versucht das Beispiel in VB.NET umzuschreiben.
Hallo Liebe Community und ein gesundes neues Jahr von meiner Seite,
gibt es einen relativ einfach Ansatz einen Slider so umzubauen das ich mir eine TimeLine daraus basteln kann? Bzw. hat das mal jemand versucht und Erfahrung sammeln können?
Ich möchte quasi einen Zeitraum von 00:00 bis 24:00 Uhr und dort mit dem Slider Von und Bis einstellen.
hab gestern irgendwie nichts mehr gesehen, zu viel XAML am Tag tut auch nicht gut, die Frage war vllt ein wenig unnötig, aber eventuell stolpert ja mal wer drüber.
Das hat aber bisher nicht geklappt, ich brauch kein bool ich kann via DataTrigger auf meinen Zustand zugreifen und wenn das Value dem Wert Beispielsweise Running entspricht kann ich die Farbe ändern, nur wie bereits gesagt ändert er die gesamte Zeile ich möchte aber nur die einzelne Row vom Zustand mit einer neuen Farbe versehen.
ist es möglich zur Laufzeit über DataTriggers die Farbe einer einzelnen Zeile zu verändern, obwohl RowBackground und AlternateRowBackground bereits vergeben sind?
Also geht es via XAML und den DataTriggers oder muss ich dort schon im Code durchgreifen?
Ich versuche die ganze Zeit eine Lösung zu finden der beste Erfolg war bisher vom DataGridTextColumn der Hintergrund des TextBlockes zu ändern (Funktioniert) sieht aber Mist aus.
Jemand eine Idee? Ich google solange weiter :/
Es soll quasi im Beispiel von dem Bild alles Rot bleiben außer die einzelnen Einträge vom Zustand die können in 7 Farben oder so variieren.
ich hab hier gerade das Problem das wenn ich meine Zeilen in einem DataGrid gruppiere, das ganze mir meinen Background der einzelnen Zeilen verschiebt.
Also aktuell hab ich es hinbekommen hier mal der Code :
Class MainWindow
Private WithEvents CurrentItem As ListBoxItem
Private _TextBox As TextBox
Private Function HeightOfItems() As Integer
Dim _Height As Integer = 0
Dim iCount As Integer = 0
Do While iCount ≤ ListBox_Main.Items.Count - 1
Dim Item = CType(ListBox_Main.ItemContainerGenerator.ContainerFromItem(ListBox_Main.Items.Item(iCount)), ListBoxItem)
' --- Das letzte Item / Neu hinzugefügt --- '
If iCount = ListBox_Main.Items.Count - 1 Then
_Height += Item.ActualHeight / 2
Else
_Height += Item.ActualHeight
End If
iCount = iCount + 1
Loop
Return _Height
End Function
Private Declare Function SetCursorPos Lib "user32" (ByVal X As Integer, ByVal Y As Integer) As Boolean
Private Sub Button1_Click(sender As System.Object, e As System.Windows.RoutedEventArgs) Handles Button1.Click
_TextBox = New TextBox
_TextBox.Width = 200
Dim _Object As Object = _TextBox
ListBox_Main.Items.Add(_Object)
ListBox_Main.SelectedIndex = ListBox_Main.Items.Count - 1
ListBox_Main.Focus()
MsgBox(ListBox_Main.SelectedIndex)
Dim _Width As Integer = ListBox_Main.ActualWidth / 2
Dim _ListBox_StartPoint As Point = ListBox_Main.PointToScreen(New Point(0, 0))
SetCursorPos(_ListBox_StartPoint.X + _Width, _ListBox_StartPoint.Y + HeightOfItems())
Dim _CurrentItem = CType(ListBox_Main.ItemContainerGenerator.ContainerFromItem(ListBox_Main.Items.Item(ListBox_Main.Items.Count - 1)), ListBoxItem)
CurrentItem = _CurrentItem
End Sub
Private Sub CurrentItem_MouseLeave(sender As Object, e As System.Windows.Input.MouseEventArgs) Handles CurrentItem.MouseLeave
' --- TextBox auf Inhalt prüfen --- '
If _TextBox.Text = "" Then
ListBox_Main.Items.RemoveAt(ListBox_Main.Items.Count - 1)
End If
End Sub
End Class
Einige Fälle sind natürlich noch nicht berücksichtigt, an sich ist die ListBox nur dafür da glaube ich eine IP - Adresse einzutragen bzw irgendein Text einzutragen, da kann nicht soviel manipuliert werden.
Findest du der Wert ist geraten? Ich nehme die exakte Position wo die ListBox beginnt, von dort aus hol ich mir beim Hinzufügen eines Eintrages die aktuelle Breite der ListBox.
Nehme davon die Hälfte, Platziere dort den Cursor.
Und die Höhe hol ich mir ja immer die aktuelle des Items. Alles ohne Raten :D
ich bin jetzt soweit das ich den Cursor auf das zuletzt hinzugefügt Item setzen kann.
Private Function HöheDerItems() As Integer
Dim Höhe As Integer = 0
Dim iCount As Integer = 0
Do While iCount ≤ ListBox_Test.Items.Count - 1
Dim Item = CType(ListBox_Test.ItemContainerGenerator.ContainerFromItem(ListBox_Test.Items.Item(iCount)), ListBoxItem)
If iCount = ListBox_Test.Items.Count - 1 Then
Höhe += Item.ActualHeight / 2
Else
Höhe += Item.ActualHeight
End If
iCount = iCount + 1
Loop
Return Höhe
End Function
ListBox_Test.Items.Add("AA")
ListBox_Test.SelectedIndex = ListBox_Test.Items.Count - 1
ListBox_Test.Focus()
Dim c As Point = ListBox_Test.PointToScreen(New Point(0, 0))
Dim Breite As Integer = ListBox_Test.ActualWidth / 2
Dim Höhe As Integer = 10
MsgBox(Breite.ToString)
c.X = c.X + Breite
c.Y = c.Y + HöheDerItems()
SetCursorPos(c.X, c.Y)
Brauch eigentlich nur noch ein Event für das ListBoxItem, tu mich da gerade noch schwer/dumm.
Naja das Ziel soll sein beim Hinzufügen eines ListBoxItems den Cursor auf das aktuell hinzugefügte Item zu setzen, da führt kein Weg dran vorbei. So ist die Vorgabe :|
Naja darauf wurde halt verwiesen, in diversen Foren Einträgen.
Ich versuch das mal nochmal ordentlich zu erklären, ich möchte in WPF :
In meinem Fenster den Cursor verschieben, der Sinn dahinter ich möchte mir via Button
ein neues ListBoxItem erstellen und auf dieses Item meinen Cursor legen.
PointFromScreen -
Konvertiert einen in Bildschirmkoordinaten angegebenen Point in einen Point, der das aktuelle Koordinatensystem des Visual darstellt.
ScreenToPoint -
Rechnet die Position des angegebenen Clientpunkts in Bildschirmkoordinaten um
Helfen mir dabei eigentlich nicht wirklich, weil sich selbst dann der Cursor nur innerhalb des Bildschirm verschiebt, nicht innerhalb des Fensters
also PointToScreen kenn ich ScreenToPoint nicht, nur PointFromScreen.
Mit beiden konnte ich bisher nicht das gewünschte Ergebnis erreichen, vllt hab ich was falsch gemacht.
Aktuell versuch ich mit
With Application.Current.MainWindow
MessageBox.Show(.Left & " " .Top)
End With
Die aktuelle Position des Fenster's zu bekommen, jedoch wirft das nicht immer optimale Ergebnisse.
Gruß
ich möchte meinen Cursor, meine Mouse Position innerhalb des Fensters ändern.
Bis hab ich herausgefunden an welcher Position sich einige Controls befinden. Nur wenn ich dann mit gewissen Standard Sachen versuche die Cursor Position zu ändern bspw.
Ändert er es auf dem gesamten Bildschirm, ich möchte mich gerne nur innerhalb des Fenster bewegen. Wenn ich versuche die Position des Fenster's zu ermitteln, um das ganze dann zu addieren, bekomme ich die Werte 0,0.
Bringt mir nichts. Hat jemand eine Idee, wie ich das ganze umsetzen kann.
ich hab mich bisher ein wenig im Buch belesen, außerdem schon eine weile gegoogled.
Ich möchte halt aus einer bestehenden Liste die sogar als Itemsource schon angebunden ist, jedes Item nach einigen Sekunden in die ListBox laden, aus dem Grund das beim erstellen dieser Liste, jedes Item unterschiedliche Zeit brauch und dadurch die gesamte Anwendung hängt.
Private Sub Button1_Click(sender As System.Object, e As System.Windows.RoutedEventArgs) Handles Button1.Click
Nas_Durchlauf.PingResult()
'ListB_Nas.Items.Refresh()
'Geräte_Durchlauf.PingResult()
'' ListB_Geräte.DataContext = Geräte_Durchlauf.PingResults
'Server_Durchlauf.PingResult()
'Drucker_Durchlauf.PrinterResult()
'Me.UpdateLayout()
Dim testThread As New System.Threading.Thread(AddressOf Test2)
testThread.Start()
End Sub
Private Sub Test1()
Try
System.Threading.Thread.Sleep(1000)
Dim Test As New Properties
Test.Name = "TEST"
Test.Zugriff = 1
Nas_Durchlauf.PingResults.Add(Test)
ListB_Nas.Items.Refresh()
System.Threading.Thread.Sleep(10000)
Dim Bla As New Properties
Bla.Name = "TEST2"
Bla.Zugriff = 0
Nas_Durchlauf.PingResults.Add(Bla)
ListB_Nas.Items.Refresh()
Catch ex As Exception
MessageBox.Show(ex.ToString)
End Try
End Sub
Private Delegate Sub DelegateTest()
Private Sub Test2()
System.Threading.Thread.Sleep(1000)
Dim test123 As New DelegateTest(AddressOf Test1)
Me.Dispatcher.Invoke(test123)
End Sub
Aber schon in diesem kleinen Versuch funktioniert es nicht, er fügt immer alles als gesamten Block hinzu. Nicht das eine Item nach 1 Sekunde und das andere nach 10 sondern alles nach 11.