Laden...

WPF Slider funktioniert nicht mit Multitouch

Erstellt von Shera vor 9 Jahren Letzter Beitrag vor 8 Jahren 3.005 Views
S
Shera Themenstarter:in
52 Beiträge seit 2011
vor 9 Jahren
WPF Slider funktioniert nicht mit Multitouch

Hey,

Ich habe ein WPF-Projekt, welches auf einem TouchMonitor mit Windows 8 läuft.
Bei dem Programm werden echt 3D-Objekte auf den Bildschirm gestellt, um das Programm damit visuell zu unterstützen.

In dem Projekt ist ein Slider mit einem Thumb.
Wenn ich mit dem Finger auf den Slider drücke und meinen Finger bewege, folgt der Thumb meinem Finger.

Wenn die 3D-Objekte auf dem Bildschirm liegen, ist der Slider allerdings blockiert.
Ich bekomme zwar TouchDown/Up/Move-Events, aber der Thumb bewegt sich nicht mit meinem Finger mit.

Hat irgendjemand eine Idee, wie ich das Problem lösen kann ?

Grüße,
Shera

5.658 Beiträge seit 2006
vor 9 Jahren

Hi Shera,

Wenn die 3D-Objekte auf dem Bildschirm liegen, ist der Slider allerdings blockiert.
Ich bekomme zwar TouchDown/Up/Move-Events, aber der Thumb bewegt sich nicht mit meinem Finger mit.

Dann mußt du wohl mal schauen, wo das Element liegt, das die 3D-Objekte beinhaltet, und warum es die Events verschluckt. Ohne den Code gesehen zu haben, kann man da nur raten.

Christian

Weeks of programming can save you hours of planning

S
Shera Themenstarter:in
52 Beiträge seit 2011
vor 8 Jahren

Es gibt keine Elemente die 3D-Objekte beinhalten. Es sind echte richtige aus dem 3D-Drucker kommende Objekte. Die liegen auf dem Bildschirm. Im Quelltext ist davon nichts zu sehen.

Hier der Beispiel-Quelltext:

<Window x:Class="MultiTouch.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525"
    <Grid>
        <Slider HorizontalAlignment="Left" Margin="70,227,0,0" VerticalAlignment="Top" Width="200" Name="SliderTest" Minimum="0" Maximum="100"/>
    </Grid>
</Window>

Und im .cs File:

using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;

namespace MultiTouch
{
    /// <summary>
    /// Interaktionslogik für MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
        }
    }
}

Wie gesagt, der Slider lässt sich mit der Maus ohne Probleme bewegen.
Er lässt sich mit dem Finger bewegen, sofern kein anderer Touchpunkt vorhanden ist.
Sobald ich einen Finger irgendwo auf das Bild lege, ist der Slider mit einem 2ten Finger nicht mehr bedienbar.

Ich habe im Quelltext nichts angepasst, wie man sieht.
Die Frage ist nun, warum ein 2ter Touchpunkt den Slider deaktiviert und wie ich das beheben kann.

Grüße,
Shera

P
441 Beiträge seit 2014
vor 8 Jahren

Ins blaue hinein vermutet benötigt der Slider Fokus, was er bei einem MultiTouch vermutlich nicht bekommt.
Habe leider keinen Touchscreen um das zu verifizieren.

Hier hatte schonmal jemand die gleichen Probleme: https://social.msdn.microsoft.com/Forums/vstudio/en-US/ecfe609d-09d5-4d78-a037-05bfe981877c/wpf-multitouch-slider?forum=wpf

189 Beiträge seit 2014
vor 8 Jahren

Hallo Shera,
ich habe noch nie für Touch-Geräte programmiert.
Ich sehe aber rein aus elektrotechnischer Sicht die Möglichkeit, dass dein aufgelegtes Objekt bei resistiven oder kapazitiven Displays als "Eingabe" gewertet wird.
Sprich, dass du bei aufgelegtem Objekt Gesten statt einfacher Clicks ausführst.
Also müsstest du unter dieser Annahme versuchen die Objekt-Eingabe zu ignorieren.

S
Shera Themenstarter:in
52 Beiträge seit 2011
vor 8 Jahren

@Ezio:
Ja du hast recht. Die Geräte werden als Eingabe gewertet. (Sehe ich anhand der Kreise, die um die Touchpunkte, die die Objekte auslösen, herum entstehen)
Allerdings hat der Monitor 30 Touchpunkte, die er gleichzeitig auswerten kann.

Also sollten die Objekte meiner Meinung nach keinen Einfluss auf einen anderen Touchpunkt haben, der weit genug entfernt ist, um nicht zu einem der 3D-Objekte zu zählen.

Ich bin mir allerdings nichtmal sicher, welche Touch-Variante das ist. Auf jeden Fall reagiert er nicht auf Druck, bzw. er muss nicht berührt werden. Es reicht wenn der Finger 1-3mm über dem Display ist um einen "Touch" auszulösen.

@Papst:
Das mit dem Fokus könnte ich mal ausprobieren.

S
Shera Themenstarter:in
52 Beiträge seit 2011
vor 8 Jahren

Ich habe es jetzt einfach selbst implementiert ...
Bzw. hatte es erst selbst implementiert und mich gewundert, warum ich den Slider, sobald er einmal in der Mitte war nicht weiter als ~15% der Sliderbreite nach links und nicht weiter als ~85% schieben konnte.

Ich habe dann diese Implementierung auf StackOverFlow gefunden. Eventuell lag es auch daran, das ich bei meiner Implementierung das IsMoveToPointEnabled nicht auf True gesetzt habe.

<Slider TouchMove="OnTouchMove" IsMoveToPointEnabled="True"/>  

IsMoveToPointEnable must be set to true for this to work.

 private void Slider_OnTouchMove(object sender, TouchEventArgs e)  
 {  
    Slider slider = (Slider)sender;          
    TouchPoint point = e.GetTouchPoint (slider );  
    double d = 1.0 / slider.ActualWidth * point.Position.X;  
    int p = int(slider.Maximum * d);  
    slider.Value = p;  
 }