Измерения IsMouseOver, Visibility и Control - PullRequest
4 голосов
/ 06 июля 2011

WPF:

<Window x:Class="WpfApplication1.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:local="clr-namespace:WpfApplication1"
        Title="MainWindow" Height="350" Width="525">

    <Window.Resources>
        <local:BooleanToVisibilityConverter x:Key="BooleanToVisibilityConverter"
                                            True="Visible"
                                            False="Collapsed" />
    </Window.Resources>

    <Canvas>
        <StackPanel Canvas.Left="100" Canvas.Top="100" Width="200" Height="100">
            <ListBox>
                <ListBoxItem>one</ListBoxItem>
                <ListBoxItem>two</ListBoxItem>
                <ListBoxItem>three</ListBoxItem>
            </ListBox>
            <StackPanel Orientation="Horizontal"
                        Visibility="{Binding
                                     RelativeSource={RelativeSource AncestorType={x:Type StackPanel}},
                                     Path=IsMouseOver,
                                     Converter={StaticResource BooleanToVisibilityConverter}}">
                <Button>one</Button>
                <Button>two</Button>
                <Button>three</Button>
            </StackPanel>
        </StackPanel>
    </Canvas>
</Window>

Код:

public abstract class BooleanConverter<T> : IValueConverter
{
    public BooleanConverter(T trueValue, T falseValue)
    {
        True = trueValue;
        False = falseValue;
    }

    public T True { get; set; }
    public T False { get; set; }

    public virtual object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        return value is bool && ((bool)value) ? True : False;
    }

    public virtual object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        return value is T && EqualityComparer<T>.Default.Equals((T)value, True);
    }
}

public class BooleanToVisibilityConverter : BooleanConverter<Visibility>
{
    public BooleanToVisibilityConverter()
        : base(Visibility.Visible, Visibility.Collapsed)
    { }
}

Моя мышь находится над ListBox, кнопки отображаются, как и ожидалось. Если мышь перемещается ниже ListBox с правой стороны, кнопки исчезают. Почему IsMouseOver ложный там? Разве высота внешнего StackPanel не должна увеличиваться, когда свойство видимости внутреннего StackPanel изменяется с Collapsed на Visible?

Вот проект, если вы хотите поиграть с ним: http://dl.dropbox.com/u/4220513/WpfApplication1.zip

enter image description here

Ответы [ 2 ]

3 голосов
/ 06 июля 2011

Вам нужно установить фон StackPanel (внешний) в прозрачный, чтобы обнаружить мышь.Если фон имеет нулевое значение, как в вашем примере, тестирование попаданий завершится неудачей.

1 голос
/ 06 июля 2011

Используйте фон для вашего StackPanel как <StackPanel Background="Transparent"> ...

...