Отключите кнопку WPF, но все еще глотайте события щелчка

Мой совет состоит в том, чтобы создать подстановочный профиль распределения. Таким образом, можно оставить в покое Идентификатор Пакета, работы значения по умолчанию.

Отпуск установка "Bundle Name" его значение по умолчанию. Можно измениться, отображенный имя путем переименования продукта (перейдите к информационному экрану проекта, выберите все конфигурации и ищите "продукт".) Можно перезаписать это с установкой Bundle Display Name, но является ненужным, если название продукта корректно.

у Вас должно быть высокое разрешение (512x512) версия Вашего логотипа или рекламного изображения, готового при представлении приложения.

, Если Ваше приложение отклоняется, яблоко говорит Вам, что зафиксировать. Они довольно разумны, не волнуйтесь об этом.

10
задан Martin Harris 6 November 2009 в 15:30
поделиться

4 ответа

Ответ RCGoforth дал мне 90% пути, но решение состоит не в том, чтобы помещать прямоугольник позади кнопки, потому что событие всплывающего канала идет вверх по дереву, а не через братьев и сестер. В конце я окружил кнопку ContentControl (поскольку прямоугольник не может иметь дочерних элементов), который поглотил событие, прежде чем оно могло подняться дальше:

<ContentControl MouseDown="ContentControl_MouseDown">
    <Button Content="Click Test"
            Padding="2"
            Command="{Binding TestCommand}"/>
</ContentControl>

В исходном коде:

private void ContentControl_MouseDown(object sender, MouseButtonEventArgs e)
{
    e.Handled = true;
}

Или сделать это полностью в XAML ( и для повышения уровня взлома кода ...)

<Button>
    <Button.Template>
        <ControlTemplate>
            <Button Content="Click Test"
                    Command="{Binding TestCommand}"/>
        </ControlTemplate>
    </Button.Template>
</Button>
10
ответ дан 4 December 2019 в 00:25
поделиться

На самом деле это не совсем чисто, но вы можете поместить прозрачный прямоугольник позади кнопки, который поглощает события нажатия.

2
ответ дан 4 December 2019 в 00:25
поделиться

Что вы хотите сделать, так это зарегистрировать обработчик перенаправленных событий, используя перегрузку, которая принимает параметр handledEventsToo , и указав для этого параметра значение true . Таким образом, ваш внешний обработчик получит событие независимо от того, действительно ли кнопка обрабатывает событие. Это будет выглядеть примерно так:

this.AddHandler(Mouse.MouseUpEvent, this.MyMouseUpHandler, true);

И затем в вашем обработчике вы всегда можете проверить, что было нажато, было ли это обработано и т.д. через MouseButtonEventArgs , который вам передали. Например, чтобы проверить, действительно ли другой элемент управления уже обработал событие, вы можете:

if(!args.Handled)
{
     // handle it here instead
}
0
ответ дан 4 December 2019 в 00:25
поделиться

Более чистое, более пригодное для повторного использования решение могло бы реализовать эту функциональность как присоединенное свойство.

Использование шаблона службы / действия:

namespace Control.Services
{

  public class UIElementService
  {
    public static readonly DependencyProperty HandleMouseEventsProperty = DependencyProperty.RegisterAttached("HandleMouseEvents",
      typeof(bool), typeof(UIElementService), new FrameworkPropertyMetadata(false, UIElementService.HandleMouseEventsPropertyChanged));

    static void HandleMouseEventsPropertyChanged(object sender, DependencyPropertyChangedEventArgs e)
    {
      FrameworkElement element = sender as FrameworkElement;
      if (element == null)
        return;

      new HandleMouseEventsAction(element);
    }

    public static bool GetHandleMouseEvents(FrameworkElement target)
    {
      return (bool)target.GetValue(HandleMouseEventsProperty);
    }

    public static void SetHandleMouseEvents(FrameworkElement target, bool value)
    {
      target.SetValue(HandleMouseEventsProperty, value);
    }

    class HandleMouseEventsAction
    {
      UIElement m_Target;
      MouseButtonEventHandler m_Handler;

      internal HandleMouseEventsAction(FrameworkElement source)
      {
        m_Source = source;
        m_Handler = new MouseButtonEventHandler(PreviewMouseLeftButtonUp);

        m_Source.Loaded += OnSource_Loaded;
        m_Source.Unloaded += OnSource_Unloaded;
      }

      void OnSource_Loaded(object sender, RoutedEventArgs e)
      {
        m_Source.AddHandler(Mouse.PreviewMouseUpEvent, m_Handler, true);
      }

      void OnSource_Unloaded(object sender, RoutedEventArgs e)
      {
        m_Source.RemoveHandler(Mouse.PreviewMouseUpEvent, m_Handler);
      }

      void PreviewMouseLeftUIElementUp(object sender, MouseUIElementEventArgs e)
      {
        e.Handled = true;
      }

    }

  }

}

Затем, чтобы использовать, импортируйте пространство имен.

<Button sv:UIElementService.HandleMouseEvents="True" />

или

<ContentControl sv:UIElementService.HandleMouseEvents="True">
    <Button Content="Click Test" Padding="2" Command="{Binding TestCommand}"/>
</ContentControl>

Я не тестировал это (в настоящий момент нет времени). Я считаю, что действие по-прежнему будет получать события мыши, даже если оно отключено.

HTH,

Dennis

0
ответ дан 4 December 2019 в 00:25
поделиться
Другие вопросы по тегам:

Похожие вопросы: