繁体   English   中英

WPF样式触发器

[英]WPF Style Trigger

我在样式触发器中更改Text的FontSize,这会导致包含文本的Control也会调整大小。 如何在不影响父母大小的情况下更改字体大小?

将元素与其父布局隔离的好方法是将元素放在Canvas中

在下面的标记中,有两个元素副本第一个是隐藏的并确定控件的大小第二个是可见的但是包装在Canvas中,因此它的布局大小不会影响父级。

<Parent>
  <Grid>
    <Element Visibility="Hidden"/>
    <Canvas>
      <Element />
    </Canvas>
  <Grid>
</Parent>

绝对不需要硬编码宽度,疯狂测量覆盖,棘手的绑定或任何类似的东西。

解决方案实际上非常简单。 而不是在样式触发器中更改字体大小,而是为您的按钮创建一个简单的控件模板,并将RenderTransform应用于内容展示器元素。 将ScaleTransform添加到RenderTransform。 在IsPressed触发器定义内,将ScaleTransform上的垂直和水平刻度设置为较小的比例,例如0.8。

使用RenderTransform将使按下的按钮的布局保持相同,因此它不会影响其他元素的位置。 相比之下,使用LayoutTransform实际上会导致按钮容器缩小,而父容器的ArrangeOverride方法会导致相邻的按钮移动以填充额外的空间。

我现在真的很忙,所以我会把实际的实现留给你! ;-)

http://msdn.microsoft.com/en-us/library/system.windows.media.scaletransform.aspx

您可以在减小FontSize的同时增加填充 - 这将导致Button的计算高度保持不变:

<StackPanel>
    <Button Content="ABC">
        <Button.Style>
            <Style TargetType="{x:Type Button}">
                <Setter Property="FontSize" Value="20"/>
                <Style.Triggers>
                    <Trigger Property="IsPressed" Value="True">
                        <Setter Property="FontSize" Value="12"/>
                        <Setter Property="Padding" Value="5"/>
                    </Trigger>
                </Style.Triggers>
            </Style>
        </Button.Style>
    </Button>
    <Button Margin="0,20" Content="123" FontSize="20"/>
    <Button Content="Do Re Mi" FontSize="20"/>
</StackPanel>

如果FontSize正在增加,您可以执行相反的操作并设置负填充。

您也可以使用从FontSize到Padding的绑定来以一般方式完成相同的操作,但是如果您只处理一组固定的FontSize,则可以更容易地对其进行硬编码。

我正在为ButtonControl创建一个ControlTemplate,所以它看起来像一个标签(平面文本,没有边框),带有IsKeyboardFocused,IsPressed,IsDefaulted等触发器。

IsPressed被定义为将FontSize(默认值为30)降低到28.提供按下的动画效果。

这些按钮的一个用途是Button的水平StackPanel,由垂直分隔符分隔。 当在按钮上触发IsPressed触发器并调整其大小时,整个按钮行将被重新调整,这不是令人愉悦的视觉效果。

我倾向于使用基于模板的解决方案,以避免引入新控件以提供覆盖。 硬编码大小方法的唯一问题是国际化,其他语言将增加原始大小。

我要解决的解决方案是在计算按钮的DesiredSize之后在C#中设置minWidth。 请注意,即使在呈现Button之后Width也是NaN,因此DesiredSize的使用/存在。 稍后我会尝试XAMLize C#。

你使用什么样的控制? 如果这是一个像GroupBox或TabItem这样的HeaderedControl,那么你需要专门设置HeaderTemplate,如下所示:

<DataTemplate x:Key="MyHeaderTemplate">
  <TextBlock Text="{Binding}" Fontsize="14" FontWeight="Bold" />
</DataTemplate>

我可以想到你可以尝试的几件事:

  • 您可以覆盖控件的Measure Pass - 当在WPF中呈现控件时,它会经历两次传递。 第一个是“测量通过”,控件提供了它想要的尺寸。 第二个是'安排通行证',它实际上是放置控件。 WPF提供了一个名为MeasureOverride的方法 如果重写此方法,则可以提供可用于调整控件大小的自定义行为。

    注意 - 我相信您必须在此覆盖期间调用Measure方法的所有控件子项,以使控件正确布局。

  • 硬编码控件的高度和宽度 - 这将使用您的值覆盖控件的DesiredSize。 虽然通常不是最好的想法,但它会起作用。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM