WPF: как сделать элемент управления наложением с прозрачным холстом и интерактивным дочерним элементом

Я хочу создать пользовательский элемент управления, который будет использоваться в качестве наложения. Элемент управления должен содержать пару дочерних элементов управления, которые должны быть нарисованы и должны быть кликабельными, как обычно. Но все остальное в контроле должно быть прозрачным и «кликабельным».

Вот как я пытаюсь добиться этого... Во-первых, я использую события PreviewMouseDown\Up\Move в окне, где будет размещен оверлей. Я хочу, чтобы эти события «проходили» через прозрачную часть моего пользовательского элемента управления, но останавливались на непрозрачном (например, на моей кнопке). Во-вторых, вот xaml для моего элемента управления (корневой узел UserControl остался нетронутым):

<Canvas Background="transparent" IsHitTestVisible="true">
     <Button Canvas.Left="384" Canvas.Top="34" Content="Button" Height="23" Name="button1" Width="75" Click="button1_Click" IsHitTestVisible="True" />
     <TextBlock Canvas.Left="27" Canvas.Top="105" Height="36" Name="textBlock1" Text="TextBlock" Width="432" FontSize="24" IsHitTestVisible="False" Foreground="Red" FontWeight="Bold" />
</Canvas>

Однако, если я установлю для Canvas IsHitTestVisible значение false, весь элемент управления, включая кнопку, станет «неуязвимым». Если установить для него значение true, все события туннелирования останавливаются на пользовательском элементе управления, и кнопка становится недоступной для нажатия.

Как правильно добиться такого поведения? Можно ли сделать это без подкласса холста (или любой другой панели)?


person Pavel Murygin    schedule 20.10.2011    source источник


Ответы (1)


Вы должны установить фон Canvas на null (или просто без фона, null по умолчанию). Transparent "виден" для щелчков мыши.

person Vlad    schedule 20.10.2011
comment
@Влад, привет, рад тебя снова видеть! Работает ли это так, что когда фон нулевой, кнопка внутри не может быть нажата, однако, когда фон прозрачен, кнопка может быть нажата? /// Кстати, большое спасибо за предыдущую помощь. Я имею в виду элемент управления TextHighlightBlock (желтый/оранжевый цвет выделения). Вы помогли мне сделать это быстро. Многие ребята в моей компании говорили мне, что работа сделана хорошо, и этот контроль был важной ее частью. - person Andrey K.; 11.10.2017
comment
@AndreyK.: Нет жесткого правила. В тесте на попадание участвует панель с фоном (белым, красным или прозрачным, не имеет значения). Таким образом, события мыши могут доставляться на такую ​​панель. Панель с фоном null (то есть без фона) не участвует в тестировании попадания. Для обычных событий проверка попадания переходит от внутренних к внешним элементам управления (поэтому щелчок по кнопке работает, даже если фон холста установлен прозрачным), но для событий предварительного просмотра все наоборот, поэтому у OP возникла проблема. - person Vlad; 11.10.2017