如何识别控件是否进入WPF中的窗口/选项卡控件边界内

时间:2010-08-04 03:33:30

标签: wpf wpf-controls

我希望当鼠标悬停在控件上时控制高度为双倍,当鼠标离开控件时控制高度应该变为正常。

考虑一下,当鼠标悬停在按钮上时,我使用以下样式将按钮高度设置为双倍。

<Style TargetType="{x:Type Buttons}">  
<Style.Triggers>  
    <Trigger Property="IsMouseOver" Value="True">  
        <Setter Property="RenderTransform"> 
            <Setter.Value> 
                <ScaleTransform ScaleX="1" ScaleY="2" /> 
            </Setter.Value> 
        </Setter> 
        <Setter Property="RenderTransformOrigin" Value="0.5,0.5"/>  
        <Setter Property="Panel.ZIndex" Value="99999"/>  
    </Trigger>  
</Style.Triggers>  

如果按钮位于窗口/选项卡控件边界附近,则按钮在扩展时进入Tab控件/窗口边界。 (当鼠标悬停在按钮上时)

我不希望按钮进入选项卡控件/窗口边界。

当按钮触摸选项卡控件/窗口边界时,按钮应该在窗口内移动(必须更改RenderTransformOrigin)。

我附上了我的示例应用程序,供您参考here

1 个答案:

答案 0 :(得分:1)

您可以尝试在RenderTransformOrigin setter上使用转换器

转换器会接受一个控件作为参数,并检查控件在其父级中的位置是否介于0和(ControlHeight / 2)之间,如果是,则计算并返回不同的RenderTransformOrigin值。如果没有,只需返回默认值(0.5,0.5)

修改 要回答你的评论,我不确定确切的语法,因为我没有测试这个,但我在考虑类似于以下内容:

创建转换器。它可能必须是一个MultiBinding转换器

public class RenderTransformConverter : IMultiValueConverter
{
    public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
    {
        // Get parameters - You'll probably want to include validation and default values
        UIElement control = (UIElement)value[0];            
        UIElement parent = (UIElement)value[1];

        int controlHeight = control.Height;
        int controlXPositionInParent = control.TranslatePoint(new Point(0, 0), parent).X;

        if (controlXPositionInParent < (controlHeight * .5))
        {
            // Calculate a new render transform. 
            // Should verify I'm doing the math right, didn't get much sleep last night
            return new Point(0.5, controlXPositionInParent / controlHeight);
        }
        else
        {
            return new Point(0.5, 0.5);
        }
    }

    public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture)
    {
        throw new NotImplementedException();
    }
}

您的XAML将包含一行以包含转换器命名空间,并创建新转换器的对象。

<localNamespace:RenderTransformConverter x:Key="renderTransformConverter />

然后你的Style会用这样的东西:

<Setter Property="RenderTransformOrigin">
<Setter.Value>
    <MultiBinding Converter="{StaticResource renderTransformConverter}">
        <Binding Path="{Binding RelativeSource=Self}" />
        <Binding Path="{Binding RelativeSource=Self, Path=Parent}" />
    </MultiBinding>
</Setter.Value>

如果您可以将控件作为参数传递给转换器,我不肯定,但如果不是,您可能需要重新排列参数以获得计算所需的任何值。