Cjreek Ответов: 1

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


Привет,

У меня есть глупая проблема с щелчком по пользовательскому элементу управления (красная сетка с желтым прямоугольником в центре) на холсте.

Правка: код xaml всегда путается и усекается. Я не знаю, как правильно это опубликовать...

Пользовательский элемент управления:
код XAML:
<resourcedictionary>
    <controltemplate x:key="TESTCONTROL" targettype="{x:Type local:TestControl}">
        <grid background="Red">
            <rectangle width="50" height="50" verticalalignment="Center" 

                       horizontalalignment="Center" fill="Yellow">

        <Setter Property="Template" Value="{StaticResource TESTCONTROL}"/>


Код:
public class TestControl : Control
{

}


Есть 2 разных случая, которые я сделал:

1) прямое добавление пользовательского элемента управления на холст:
код XAML:
<window>
  <canvas x:name="TestCanvas" mouseleftbuttondown="TestCanvas_MouseLeftButtonDown">


Код:
public partial class MyWindow : Window
{
  public MainWindow()
  {
    InitializeComponent();

    TestControl control = new TestControl();
    control.Width = 100;
    control.Height = 100;

    TestCanvas.Children.Add(control);
  }
}


2) Использование ItemsControl с холстом в качестве ItemPanel (ItemsSource + List)
код XAML:
<window>
  <itemscontrol x:name="TestItemsCtrl">
    <itemscontrol.itemspanel>
      <itemspaneltemplate>
        <canvas mouseleftbuttondown="TestCanvas_MouseLeftButtonDown">


Код:
public partial class MyWindow : Window
{
  public MainWindow()
  {
    InitializeComponent();

    TestControl control = new TestControl();
    List<testcontrol> controlList = new List<testcontrol>();
    controlList.Add(control);

    TestItemsCtrl.ItemsSource = controlList;
  }
}


Теперь, если я запускаю программу и нажимаю на элемент управления, я проверяю аргумент e. Source/e. OriginalSource:
private void TestCanvas_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{
  Title = e.Source.GetType().Name;
}


Для случая 1 это показывает "TestControl" независимо от того, где я нажимаю на свой TestControl. Это мое желаемое поведение.
Для случая 2 это отображает имя класса любой части "TestControl", на которую я нажал. ("Сетка" или "прямоугольник").

Почему существует эта разница и что я могу сделать, чтобы получить весь TestControl вместо его частей, все еще используя ItemsControl?

Что я уже пробовал:

Я пробовал элементом itemtemplate с моего управления ItemsControl, хотя она мне не нужна/не нужен, потому что свойство ItemsSource содержит в себе элементы управления, так что нет необходимости для шаблона в данном случае.

Я пытался прикрепить событие на элемент управления ItemsControl вместо холста (для).
Это не имеет никакого содержательного значения. (За исключением источника содержит е.Источника содержит сам элемент управления ItemsControl и электронной.OriginalSource, содержащиеся сетки/части прямоугольник из моих TestControl вместо самого TestControl.

#realJSOP

Я обновил свое решение.

1 Ответов

Рейтинг:
1

#realJSOP

Поместите один из них в свой обработчик событий:

Canvas ctrl = sender as Canvas;


- или -

Canvas ctrl = (Canvas)sender;


Если холст имеет значение null, этот метод:

/// <summary>
/// Finds the parent.
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="child">The child.</param>
/// <returns></returns>
public static T FindParent<T>(DependencyObject child) where T : DependencyObject
{
    //get parent item
    DependencyObject parentObject = VisualTreeHelper.GetParent(child);
 
    //we've reached the end of the tree
    if (parentObject == null) return null;
 
    //check if the parent matches the type we're looking for
    T parent = parentObject as T;
    if (parent != null)
    {
        return parent;
    }
    else
    {	 
        return FindParent<T>(parentObject);
    }
}


Использование:

Canvas canvas = FindParent<canvas>(sender);


Помните, что вам все равно нужно определить, является ли sender canvas перед вызовом этого метода, просто на случай, если пользователь действительно нажал на canvas, а не на дочерний элемент управления на canvas.