(WPF) Как вы привязываетесь к IsMouseOver в пользовательском контроле - PullRequest
2 голосов
/ 06 июня 2009

Редактировать: исходная предпосылка вопроса была неверной, поэтому пересмотрел вопрос:

По сути, я хочу, чтобы кнопка была видна только тогда, когда мышь находится над содержащим пользовательский элемент управления. Вот упрощенная версия того, что у меня есть:

<UserControl
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    x:Class="MyNamespace.MyUserControl"
    x:Name="myUserControl">
    <Textbox>Some Text</Textbox>
    <Button Visibility="{Binding ElementName=myUserControl, Path=IsMouseOver, Converter={StaticResource mouseOverVisibilityConverter}}" />
</UserControl>

Что работает, если мышь находится над текстовым полем, но не где-либо еще в пользовательском элементе управления.

Ответы [ 3 ]

6 голосов
/ 06 июня 2009

Я пересмотрел вопрос, как только Томас указал на ложное предположение в моем первоначальном вопросе, которое привело меня к выяснению реальной причины, по которой он не работал в этом посте .

В основном пользовательский элемент управления имеет нулевой фон (в отличие от прозрачного), что, по-видимому, делает его невидимым для мыши, даже если для IsHitTestVisible задано значение true, поэтому решением было добавить Background = "Transparent" в пользовательский элемент управления.

2 голосов
/ 06 июня 2009

Я понял, что UserControl не имеет свойства IsMouseOver

Но это так ... IsMouseOver определен в классе UIElement, от которого UserControl (косвенно) наследует

1 голос
/ 06 июня 2009

Вы можете реализовать это свойство в производном классе. Я должен был делать подобные вещи раньше.

Private _IsMouseOver As Boolean = False

Protected Overrides Sub OnMouseEnter(ByVal sender As Object, ByVal e As MouseEventArgs)
     _IsMouseOver = True
     MyBase.OnMouseEnter(sender, e)
End Sub

Protected Overrides Sub OnMouseLeave(ByVal sender As Object, ByVal e As MouseEventArgs)
     _IsMouseOver = False
     MyBase.OnMouseLeave(sender, e)
End Sub

Public ReadOnly Property IsMouseOver As Boolean()
    Get
        Return _IsMouseOver
    End Get
End Property
...