Поместите прямоугольник в шаблон кнопки и обработайте событие нажатия кнопки.Не забудьте установить для прямоугольника Fill значение Transparent, иначе щелчки мыши в области заполнения кнопки не будут обнаружены.
<Button Click="Rectangle_Click">
<Button.Template>
<ControlTemplate TargetType="Button">
<Rectangle
Fill="Transparent"
Stroke="Blue"
StrokeThickness="0.5"
Width="{Binding Width}"
Height="{Binding Height}"
/>
</ControlTemplate>
</Button.Template>
</Button>
private void Rectangle_Click(object sender, RoutedEventArgs e)
{
var button = sender as Button;
var square = button.DataContext as Square;
// Do whatever
}
Было бы предпочтительно дать Square
свойство команды и связать Button.Command с этим:
public class Square
{
// stuff
public ICommand SelectCommand { get; } // Initialize in constructor
// stuff
}
<Button Command="{Binding SelectCommand}">
<!-- ...as before... -->
Но тогда вам нужнореализовать ICommand и т. д. Событие Click работает достаточно хорошо.
Вы также можете обрабатывать MouseLeftButtonDown на самом прямоугольнике.Вам все равно придется установить его Fill на Transparent.Я предпочитаю это решение, потому что поведение Click более сложное, чем MouseLeftButtonDown: например, когда вы нажимаете кнопку мыши и перетаскиваете ее, прежде чем отпустить кнопку мыши, Click не поднимается.Пользователи привыкли к такому поведению.