我更改樣式觸發器中文本的字體大小,這會導致包含文本的控件也要調整大小。如何更改Fontsize而不影響父級的大小?WPF樣式觸發器
WPF樣式觸發器
回答
您使用的是什麼樣的控件?如果這是像一個分組框或TabItem的一個HeaderedControl那麼你就需要專門設置HeaderTemplate中是這樣的:
<DataTemplate x:Key="MyHeaderTemplate">
<TextBlock Text="{Binding}" Fontsize="14" FontWeight="Bold" />
</DataTemplate>
我能想到幾件事情,你可以嘗試:
你可以覆蓋控制的測量通過 - 當WPF中呈現控件時,它會經歷兩次通過。第一個是'測量通行證',其中控制符合它想要成爲的尺寸。第二個是「安排通行證」,它實際上是在規定控制權。 WPF提供了一種名爲MeasureOverride.的方法如果覆蓋此方法,則可以提供可用於調整控件大小的自定義行爲。
注意 - 我相信您必須在此覆蓋期間調用Measure方法來控制您的所有控件,以便讓您的控件正確佈局。
硬編碼在控制的高度和寬度 - 這將覆蓋控制的DesiredSize與你的價值觀。雖然通常不是最偉大的想法,但它會起作用。
我創建了一個ButtonControl這樣的ControlTemplate它看起來像一個標籤(純文本,無邊框)與IsKeyboardFocused,IsPressed,IsDefaulted等
觸發器的IsPressed被定義爲刪除字號(從30的默認值)降低到28.給予按下的動畫效果。
這些按鈕的一個用途是按鈕的水平StackPanel,由垂直分隔符分隔。當按鈕觸發IsPressed觸發器並調整大小時,會重新調整整行按鈕,這不是令人愉快的視覺效果。
我偏好使用基於模板的解決方案,以避免引入新控件以提供覆蓋。硬編碼尺寸方法的唯一問題是國際化,其他語言將增加原始尺寸。
我正在使用的解決方案是在計算完按鈕的DesiredSize之後,在C#中設置minWidth。請注意,即使在呈現Button之後,Width也是NaN,因此DesiredSize的使用/存在。稍後我會嘗試和XAMLize C#。
您可以在同一時間增加填充你降低字號 - 這將導致按鈕的計算高度保持不變:
<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,那麼就像上面那樣硬編碼會更容易。
一個不錯的把戲元素從其父佈局明智的隔離是將元素放置在畫布
在標記下方有你的元素的兩個副本 首先是隱藏的,建立的大小你控制 第二個可見但包裹在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
- 1. WPF樣式觸發器TemplateBinding
- 2. WPF觸發器和樣式
- 3. TreeView上的WPF樣式觸發器?
- 4. 用於DataTemplates的WPF樣式觸發器
- 5. 在wpf中重用樣式觸發器
- 6. WPF屬性目標樣式觸發
- 7. WPF觸發/樣式替代另一個
- 8. WPF樣式觸發國外的UIElement
- 9. WPF觸發器
- 10. 動態路徑上的wpf樣式觸發器
- 11. WPF數據觸發器和更改控件的樣式
- 12. 來自另一個控件的WPF樣式觸發器
- 13. 通過WPF樣式或觸發器設置TaskbarItemInfo
- 14. WPF更新邊框樣式BlockText觸發器
- 15. Wpf組合框樣式觸發器和綁定
- 16. 生成包含來自C#觸發器的WPF樣式代碼
- 17. WPF默認值(使用樣式觸發器)綁定
- 18. 無法使用樣式觸發器禁用WPF DataGrid中的行
- 19. WPF ControlTemplate觸發器
- 20. WPF擴展器觸發器
- 21. WPF - 觸發器沒有觸發
- 22. 自定義控件樣式/觸發器
- 23. Windows Phone 7中的樣式觸發器
- 24. DataGridCell.Template樣式覆蓋IsSelected觸發器
- 25. TextBox中的樣式和觸發器
- 26. 內部樣式觸發器的StoryBoard
- 27. 樣式觸發器以應用另一種樣式
- 28. WPF觸發器不工作
- 29. WPF DataGridRow - 在觸發器
- 30. WPF複選框,觸發器