WPF样式触发器

时间:2008-11-26 18:33:51

标签: wpf triggers styles

我在样式触发器中更改文本的字体大小,这会导致包含文本的控件也会调整大小。如何更改字体大小而不影响父级的大小?

6 个答案:

答案 0 :(得分:7)

将元素与其父布局明智隔离的一个好方法是将元素放在Canvas

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

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

答案 1 :(得分:3)

您可以在减少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,那么就像上面那样对它进行硬编码会更容易。

答案 2 :(得分:3)

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

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

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

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

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

答案 3 :(得分:1)

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

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

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

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

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

答案 4 :(得分:0)

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

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

答案 5 :(得分:0)

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

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

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

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