我希望当鼠标悬停在控件上时控制高度为双倍,当鼠标离开控件时控制高度应该变为正常。
考虑一下,当鼠标悬停在按钮上时,我使用以下样式将按钮高度设置为双倍。
<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。
答案 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>
如果您可以将控件作为参数传递给转换器,我不肯定,但如果不是,您可能需要重新排列参数以获得计算所需的任何值。