Мой совет состоит в том, чтобы создать подстановочный профиль распределения. Таким образом, можно оставить в покое Идентификатор Пакета, работы значения по умолчанию.
Отпуск установка "Bundle Name" его значение по умолчанию. Можно измениться, отображенный имя путем переименования продукта (перейдите к информационному экрану проекта, выберите все конфигурации и ищите "продукт".) Можно перезаписать это с установкой Bundle Display Name, но является ненужным, если название продукта корректно.
у Вас должно быть высокое разрешение (512x512) версия Вашего логотипа или рекламного изображения, готового при представлении приложения.
, Если Ваше приложение отклоняется, яблоко говорит Вам, что зафиксировать. Они довольно разумны, не волнуйтесь об этом.
Ответ 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>
На самом деле это не совсем чисто, но вы можете поместить прозрачный прямоугольник позади кнопки, который поглощает события нажатия.
Что вы хотите сделать, так это зарегистрировать обработчик перенаправленных событий, используя перегрузку, которая принимает параметр handledEventsToo
, и указав для этого параметра значение true . Таким образом, ваш внешний обработчик получит событие независимо от того, действительно ли кнопка обрабатывает событие. Это будет выглядеть примерно так:
this.AddHandler(Mouse.MouseUpEvent, this.MyMouseUpHandler, true);
И затем в вашем обработчике вы всегда можете проверить, что было нажато, было ли это обработано и т.д. через MouseButtonEventArgs
, который вам передали. Например, чтобы проверить, действительно ли другой элемент управления уже обработал событие, вы можете:
if(!args.Handled)
{
// handle it here instead
}
Более чистое, более пригодное для повторного использования решение могло бы реализовать эту функциональность как присоединенное свойство.
Использование шаблона службы / действия:
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