2012-02-10 78 views
1

我在一些其他控制的網格放置模板按鈕與一些內容在它裏面(包括圖像和的TextBlocks)內:約束WPF元件寬度其容器

<SomeControl> 
    <Grid> 
     <SpecialButton/> 
    </Grid> 
</SomeControl> 

<Style TargetType="{x:Type local:SpecialButton}">> 
    ... 
    <Setter Property="Template"> 
     <Setter.Value> 
     ... 
      <TextBlock/> 
      <TextBlock/> 
     </Setter.Value> 
</Style> 

的「SomeControl」控件的寬度是動態 - 也就是說 - 它可以根據屏幕寬度,容器寬度等進行動態更改。因此,我使用另一種方法計算「SpecialButton」的寬度。
只要按鈕內的TextBlock是不寬,則該按鈕本身的「SpecialButton」正被完美地匹配它的大小,它的「SomeControl」容器。
但是,如果TextBlock的文本長度超過「SpecialButton」的寬度,則「SpecialButton」右邊框消失,並且該按鈕看起來非常糟糕。儘管如此,儘管圖紙計算不準確,但「SpecialButton」的寬度仍然保持在其容器寬度上。
我試圖找到一種方法來強制TextBlock的(或更好的整個網格的寬度)沒有定義一個absoulte寬度,所以「SpecialButton」仍然會得到良好的繪製,並忽略它的兒童溢出。如CSS的{溢出:隱藏}東西就已經很大...
注:
我不能讓包裝自「SpecialButton」高度也constained(手動計算)。

+1

如果你有你的按鈕最大寬度,你不能讓包裝,你能允許截斷?你想要的最終結果是什麼?你是否希望按鈕繼續增長,直到它填滿容器的寬度,然後停止並截斷文本? – CodeWarrior 2012-02-10 15:18:01

+0

此外,如果您答覆了答案並標記爲答案,您可能會收到更多有興趣回答您的問題的人。 – CodeWarrior 2012-02-10 16:48:39

+0

是的,我可以允許截斷,這是我正在尋找的確切結果 - 文本將被截斷以適應**當前**最大可用空間。 – Tomer 2012-02-11 02:48:18

回答

4

寬度(和高度)在WPF元素是非常簡單的,一旦你習慣了它。默認情況下,您的網格設置爲「自動寬度」,這意味着它會請求父寬度的100%。

而不是設置一個最大尺寸的,我一般把,我想動態調整大小和位置在網格中設置網格的行和列大小的物品。所以如果我想要某些東西佔據1/3的可用水平空間,我可以有一個兩列的網格,一個寬度設置爲「1 *」,另一個設置爲「2 *」(2/3是兩倍1/3的大小),並將我的項目放在第1列中以佔用所有可用的寬度。

在你的情況下,文本需要被截斷,因爲它是盡最大的努力使所有的文字,並延長了按鈕過界它的容器來做到這一點。內置修剪功能有兩種選擇。 TextTrimming="CharacterEllipsis"TextTrimming="WordEllipsis"只是把它放在你的文本塊中。我會將文本塊放在某種容器中,以保持它們的獨立性。如果第一個內容足夠長,可能會將另一個完全推離側面。

元漿紗

<Window 
    x:Class="MainWindow" 
    x:Name="Window" 
    Title="MainWindow" 
    Width="640" Height="480"> 
    <Grid x:Name="LayoutRoot" DataContext="{Binding}"> 
     <Grid.ColumnDefinitions> 
      <ColumnDefinition Width="1*"/> 
      <ColumnDefinition Width="2*"/> 
     </Grid.ColumnDefinitions> 
     <local:SomeControl Margin="8,8,8,0"/> 
    </Grid> 
</Window> 

文本剪裁

<ControlTemplate x:Key="ButtonBaseControlTemplate1" TargetType="{x:Type ButtonBase}"> 
    <Microsoft_Windows_Themes:ButtonChrome x:Name="Chrome" BorderBrush="{TemplateBinding BorderBrush}" Fill="{TemplateBinding Background}" RenderMouseOver="{TemplateBinding IsMouseOver}" RenderPressed="{TemplateBinding IsPressed}" RenderDefaulted="{TemplateBinding Button.IsDefaulted}" SnapsToDevicePixels="True" ThemeColor="Metallic"> 
     <TextBlock Text="{TemplateBinding Content}" TextTrimming="WordEllipsis" HorizontalAlignment="Center" VerticalAlignment="Center" /> 
    </Microsoft_Windows_Themes:ButtonChrome> 
    <ControlTemplate.Triggers> 
     <Trigger Property="IsKeyboardFocused" Value="True"> 
      <Setter Property="RenderDefaulted" TargetName="Chrome" Value="True"/> 
     </Trigger> 
     <Trigger Property="ToggleButton.IsChecked" Value="True"> 
      <Setter Property="RenderPressed" TargetName="Chrome" Value="True"/> 
     </Trigger> 
     <Trigger Property="IsEnabled" Value="False"> 
      <Setter Property="Foreground" Value="{DynamicResource {x:Static SystemColors.GrayTextBrushKey}}"/> 
     </Trigger> 
    </ControlTemplate.Triggers> 
</ControlTemplate> 

此外,您可能希望將文本框的提示設置爲文本也值。如果文本被截斷並且用戶想要查看它是什麼,他們可以將鼠標懸停在按鈕上並查找。