2008-11-26 77 views
3

我更改樣式觸發器中文本的字體大小,這會導致包含文本的控件也要調整大小。如何更改Fontsize而不影響父級的大小?WPF樣式觸發器

回答

0

您使用的是什麼樣的控件?如果這是像一個分組框或TabItem的一個HeaderedControl那麼你就需要專門設置HeaderTemplate中是這樣的:

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

我能想到幾件事情,你可以嘗試:

  • 你可以覆蓋控制的測量通過 - 當WPF中呈現控件時,它會經歷兩次通過。第一個是'測量通行證',其中控制符合它想要成爲的尺寸。第二個是「安排通行證」,它實際上是在規定控制權。 WPF提供了一種名爲MeasureOverride.的方法如果覆蓋此方法,則可以提供可用於調整控件大小的自定義行爲。

    注意 - 我相信您必須在此覆蓋期間調用Measure方法來控制您的所有控件,以便讓您的控件正確佈局。

  • 硬編碼在控制的高度和寬度 - 這將覆蓋控制的DesiredSize與你的價值觀。雖然通常不是最偉大的想法,但它會起作用。

1

我創建了一個ButtonControl這樣的ControlTemplate它看起來像一個標籤(純文本,無邊框)與IsKeyboardFocused,IsPressed,IsDefaulted等

觸發器的IsPressed被定義爲刪除字號(從30的默認值)降低到28.給予按下的動畫效果。

這些按鈕的一個用途是按鈕的水平StackPanel,由垂直分隔符分隔。當按鈕觸發IsPressed觸發器並調整大小時,會重新調整整行按鈕,這不是令人愉快的視覺效果。

我偏好使用基於模板的解決方案,以避免引入新控件以提供覆蓋。硬編碼尺寸方法的唯一問題是國際化,其他語言將增加原始尺寸。

我正在使用的解決方案是在計算完按鈕的DesiredSize之後,在C#中設置minWidth。請注意,即使在呈現Button之後,Width也是NaN,因此DesiredSize的使用/存在。稍後我會嘗試和XAMLize C#。

3

您可以在同一時間增加填充你降低字號 - 這將導致按鈕的計算高度保持不變:

<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,那麼就像上面那樣硬編碼會更容易。

7

一個不錯的把戲元素從其父佈局明智的隔離是將元素放置在畫布

在標記下方有你的元素的兩個副本 首先是隱藏的,建立的大小你控制 第二個可見但包裹在Canvas中,因此其佈局大小不會影響父級。

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

絕對不需要硬編碼寬度,瘋狂度量覆蓋,棘手的綁定或任何類型的東西。

該解決方案實際上非常簡單。將RenderTransform應用於內容展示器元素,而不是在樣式觸發器中更改字體大小,而是爲您的按鈕創建一個簡單的控件模板。將ScaleTransform添加到RenderTransform。在IsPressed觸發器定義中,將ScaleTransform上的垂直和水平比例設置爲較小的比例,比如0.8。

使用RenderTransform將保持按下按鈕的佈局與之相同,所以它不會影響其他元素的位置。相比之下,使用LayoutTransform實際上會導致按鈕容器縮小,並且父容器的ArrangeOverride方法會導致相鄰按鈕移動以填充額外空間。

我現在真的很忙,所以我會把實際的實施留給你! ;-)

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