Как обрабатывать сенсорные события пользовательского элемента управления в Blackberry10

У меня есть пользовательский элемент управления customContextMenu.qml, в каждой строке которого есть изображение и метка. Я хочу обрабатывать щелчок/прикосновение к этому изображению и метке вместе. Как мне это сделать?

В настоящее время я добавляю onTouch() в каждый контейнер, содержащий изображение и метку, но это не работает. Я использую этот элемент управления customContextMenu в моем main.qml.

Container {

  id: testPageCustomMBoxContainer
  objectName: "testPageCustomMBoxContainer"

  background:dropdownBack.imagePaint
  attachedObjects: [
    ImagePaintDefinition {
      id: dropdownBack
      repeatPattern: RepeatPattern.Fill
      imageSource: "asset:///images/dropdown_bg.png"
    }
  ]

layout: StackLayout {
  orientation: LayoutOrientation.TopToBottom  
}

maxWidth: 200.0 
maxHeight: 180.0
horizontalAlignment: HorizontalAlignment.Right
verticalAlignment: VerticalAlignment.Top

Container {

  id: testPageCustomMBoxRetestContainer
  objectName: "testPageCustomMBoxRetestContainer"

  preferredWidth:200.0
  preferredHeight:90.0 
  layout: StackLayout {
    orientation: LayoutOrientation.LeftToRight   
  }

  leftPadding: 10.0
  topPadding: 10.0
  bottomPadding: 10.0
  rightPadding: 20.0
  ImageView {
    imageSource: "asset:///images/retest.png"
    scalingMethod: ScalingMethod.AspectFit
    verticalAlignment: VerticalAlignment.Center
    layoutProperties: StackLayoutProperties {
      spaceQuota: 1.0
    }
  }

  Label {
    text: "Retest"
    horizontalAlignment: HorizontalAlignment.Right
    verticalAlignment: VerticalAlignment.Center
    textFormat: TextFormat.Plain

    layoutProperties: StackLayoutProperties {
      spaceQuota: 3.0
    }
  }

  onTouch: {    
    var retestPage = retestPage.createObject();
    testNavigationPane.push(retestPage);
  }
  attachedObjects: [
    ComponentDefinition {
      id:retestPage
      source: "main.qml"
    }
  ]
}
Container {

  id: testPageCustomMBoxHelpContainer
  objectName: "testPageCustomMBoxHelpContainer"

  preferredWidth: 200.0 
  preferredHeight: 90.0 
  layout: StackLayout {
    orientation: LayoutOrientation.LeftToRight
  }

  leftPadding: 10.0
  topPadding: 5.0
  bottomPadding: 15.0
  rightPadding: 20.0
  ImageView {
    imageSource: "asset:///images/help.png"
    scalingMethod: ScalingMethod.AspectFit

    verticalAlignment: VerticalAlignment.Center

    layoutProperties: StackLayoutProperties {
      spaceQuota: 1.0
    }
  }

  Label {
    text: "Help"
    horizontalAlignment: HorizontalAlignment.Right
    verticalAlignment: VerticalAlignment.Center
    textFormat: TextFormat.Plain 
    layoutProperties: StackLayoutProperties {
      spaceQuota: 3.0
    }

    onTouch: {
      var helpPage = helpPage.createObject();
      testNavigationPane.push(helpPage);
    }
    attachedObjects: [
      ComponentDefinition {
        id: helpPage
        source: "helpPage.qml"
        Page {
          paneProperties: NavigationPaneProperties {
            backButton: ActionItem {
              onTriggered: {
                testNavigationPane.pop();
              }
            }
          }
        }
      }
    ]
  }
}

person sumitl    schedule 26.08.2013    source источник
comment
Так что не работает?   -  person Konrad Lindenbach    schedule 26.08.2013
comment
touch не работал... но теперь он работает... но каким-то образом создается и открывается определенное количество страниц, тогда как я прикрепил только одну страницу к ontouch(). Кто-нибудь может дать мне решение, почему это количество страниц открытие??   -  person sumitl    schedule 27.08.2013


Ответы (1)


Вам нужно использовать обработчики жестов для таких вещей, как Touched или LongPressed. Событие onTouch будет использоваться только в том случае, если вы пытаетесь что-то сделать, пока пользователь держит палец или что-то подобное. Вот пример кода, показывающий различия между ними:

//Touched event - only fires if user touches and lets go of element.
//This is the preferred method
gestureHandlers: [
    TapHandler {
        onTapped: {
            //Code goes here
        }
    }
]

//Display active image if touched
//This would be used for something such as changing a background color of a button when pressed.
onTouch: {
    if (event.touchType == TouchType.Down) {
        //Do something on down touch - e.g. change background color
    } else if (event.touchType == TouchType.Up || event.touchType == TouchType.Cancel)     {
       //Users finger has been lifted OR has left the element.
    }
}
person hyarion    schedule 27.08.2013
comment
хорошо...!! Спасибо..! Я попробовал это с помощьюgestHandler, и это сработало, как и ожидалось! но я до сих пор не могу понять, почему он открывал количество страниц с помощью onTouch() ?? - person sumitl; 28.08.2013
comment
onTouch() срабатывает постоянно, пока к элементу прикасаются. Поэтому, если вы используете это событие, а затем нажимаете кнопку, оно будет запускать событие пару раз, прежде чем появится первая страница (что затем предотвратит дальнейшие события касания). - person hyarion; 28.08.2013