4

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 が false なのはなぜですか? 内側の StackPanel の Visibility プロパティが Collapsed から Visible に変更されたときに、外側の StackPanel の高さを増やすべきではありませんか?

試してみたい場合のプロジェクトは次のとおりです: http://dl.dropbox.com/u/4220513/WpfApplication1.zip

ここに画像の説明を入力

4

2 に答える 2

3

マウスオーバーを検出するには、StackPanel (外側) の背景を透明に設定する必要があります。サンプルのように background が null の場合、ヒット テストは失敗します。

于 2011-07-06T19:56:25.710 に答える
1

あなたのStackPanel好きな背景を使用してください<StackPanel Background="Transparent">...

于 2011-07-06T19:57:06.200 に答える