我在样式触发器中更改文本的字体大小,这会导致包含文本的控件也会调整大小。如何更改字体大小而不影响父级的大小?
答案 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。虽然通常不是最好的想法,但它会起作用。