2016-04-15 1 views
2

У меня есть небольшая помощь от другой темы, которую я не полностью понял.C# Отсутствует TapHandler в RelayCommand

Это UserControl, который различает несколько типов текстов и делает их похожими на одно текстовое поле. Некоторые из типов (например, гиперссылки) являются интерактивными.

Чтобы щелкнуть по ним, у меня есть этот код.

public class RelayCommand<T> : ICommand 
{ 
    readonly Action<T> _execute; 
    readonly Func<T, bool> _canExecute; 

    public event EventHandler CanExecuteChanged; 

    public RelayCommand(Action<T> execute, Func<T, bool> canExecute = null) 
    { 
     _execute = execute; 
     _canExecute = canExecute; 
    } 

    public void RefreshCommand() 
    { 
     var cec = CanExecuteChanged; 
     if (cec != null) 
      cec(this, EventArgs.Empty); 
    } 

    public bool CanExecute(object parameter) 
    { 
     if (_canExecute == null) return true; 
     return _canExecute((T)parameter); 
    } 

    public void Execute(object parameter) 
    { 
     _execute((T)parameter); 
    } 
} 

Проблема заключается в том, что я хочу остановить событие Tap/Click после нажатия на ссылки. Обычно, чтобы предотвратить появление пузыря, я бы сделал это e.Handled = True. Но в этом случае у меня нет TappEvent по ссылкам.

код- позади пользовательского элемента управления выглядит следующим образом:

private void Init() 
    { 
     //ComplexTextPresenterElement.Input = "This is where the Content string has to be...."; 
     ComplexTextPresenterElement.OnHyperlinkCommand = new RelayCommand<object>(Execute); 
    } 

    private async void Execute(object o) 
    { 
     List<object> passingParameters = new List<object>(); 

     //put here the code that can open browser 
     if (o is HyperLinkPart) 
     { 
      var obj = (HyperLinkPart)o; 
      await Windows.System.Launcher.LaunchUriAsync(new Uri(obj.RealUrl, UriKind.Absolute)); 
     } [...] 

Перед открывает веб-браузер я должен остановить TapEvent который вызывается из UI элемента вокруг этого UserControl.

Надеюсь, этого достаточно. Дайте мне знать иначе.

Cheers,

Ulpin

ответ

0

Иметь BOOL canTapBrowser = ложь; Изменить этот

ComplexTextPresenterElement.OnHyperlinkCommand = new RelayCommand<object>(Execute); 

Для

ComplexTextPresenterElement.OnHyperlinkCommand = new RelayCommand<object>(Execute,()=> {return canTapBrowser}); 

В webbrower навигации завершенного события сделайте следующее:

canTapBrowser = true; 
OnHyperlinkCommand.RefreshCommand(); 
+0

Thx за ответ, но я не получаю это. Почему этот Bool не сможет перейти на следующую страницу? Проблема в том, что у всей поверхности UserControl есть TappEvent, который ведет после нажатия на следующую страницу моего приложения. Теперь, с новыми ссылками в этом пользовательском элементе управления, я не хочу, чтобы этот TappEvent выполнялся, если вы нажмете на новые ссылки. Поскольку я не могу установить этот TappEvent в 'e.Handled = true', приложение переходит на следующую страницу задолго до завершения навигации веб-браузера. Сообщите мне, если вам нужен еще какой-либо код или дополнительная информация ... – Ulpin

+0

Немного подробное объяснение об использовании usecase/сценария поможет. Я смущен тем, что именно вы хотите, чтобы команда выполняла. Это для веб-просмотра для навигации или обработки событий. –

+0

Хорошо. Итак, что я сделал до сих пор: это приложение Twitter. Если вы щелкните/коснитесь окружающего пробела твита, приложение перейдет на новую страницу, отображающую этот твит. Это то, что я имел в виду с UserControl и TappEvent. Следующее, что я сделал, это реализовать новый UserControl, который представляет текстовое поле с содержимым twitter. Это было проблематично, потому что нет текстового поля по умолчанию с гиперссылками и т. Д. В приведенном выше примере кода я только разместил часть с гиперссылкой, но, как вы можете себе представить, есть Hashtags и @ -TwitterHandles, которые должны быть связаны. – Ulpin