2012-02-10 77 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> 

此外,您可能希望将文本框的提示设置为文本也值。如果文本被截断并且用户想要查看它是什么,他们可以将鼠标悬停在按钮上并查找。