TextBox
имеет контекстное меню по умолчанию. Я хотел бы добавить элемент к нему. ОК, это означает клонирование по умолчанию и добавление к нему дополнительного элемента. Может быть, даже с радикальными, космическими особенностями далекого будущего, такими как быстрые клавиши, но давайте не будем жадными. Дебилы, которые разработали структуру, увидели все, что может потребоваться программисту, и предприняли шаги, чтобы предотвратить это.Контекстное меню WPF
Теперь я хотел бы использовать код здесь. У меня есть пять текстовых полей. Каждый из них нуждается в дополнительном элементе в своем контекстном меню. Элемент должен действовать в текстовом поле, которое было нажато. Я знаю, что «копировать и вставлять» является рекомендуемым методом повторного использования кода в WPF, но, если возможно, я бы предпочел не определять пять меню в XAML и пять команд в коде.
Есть ли способ сделать это в WPF, не потратив полтора дня на какую-то смехотворную чудовищность Rube Goldberg WTF, которая требует четырех часов для исследования, восемь часов для реализации и включает в себя 300 строк кода и 400 строк XAML ?
public partial class MyGhastlyView
{
/* blah blah */
private void MenuCut_Click(object sender, RoutedEventArgs e)
{
try
{
(sender as MenuItem).GetPlacementTarget<TextBox>().Cut();
}
catch (Exception)
{
}
}
/* blah blah */
}
public static class FurshlugginerExtensions
{
public static bool TryGetPlacementTarget<TTargetType>(this MenuItem mi,
out TTargetType target) where TTargetType : class
{
target = null;
var cm = mi.GetContextMenu();
if (null != cm)
{
target = cm.PlacementTarget as TTargetType;
}
return null != target;
}
public static TTargetType GetPlacementTarget<TTargetType>(this MenuItem mi)
where TTargetType : class
{
var cm = mi.GetContextMenu();
return (cm == null)
? null
: cm.PlacementTarget as TTargetType;
}
public static ContextMenu GetContextMenu(this MenuItem mi)
{
var logicalParent = LogicalTreeHelper.GetParent(mi);
if (logicalParent is ContextMenu)
{
return logicalParent as ContextMenu;
}
else if (logicalParent is MenuItem)
{
return (logicalParent as MenuItem).GetContextMenu();
}
return null;
}
}
UPDATE
То, что я ищу, оказывается, чтобы быть RoutedUICommand, с некоторыми возиться вокруг в XAML. Он знает, на что вы нажали (с некоторыми исключениями Kafkaesque из-за пузыря событий, но может просто установить CommandParameter в ContextMenu).
Я чувствую, что ваши отношения с WPF является ... сложным. – McGarnagle
@McGarnagle lol! «Сложный» - это одно слово для него ... –