动态减少FontSize以避免溢出

时间:2012-04-17 13:37:45

标签: c# wpf overflow itemscontrol font-size

我编写了一个带有ButtonItemsControl的玩具WPF应用程序。每次单击Button时,字符串“AnotherWord”都会添加到ItemsControl。现在,ItemsControl显示为水平方向StackPanel,具有固定宽度(500像素)。这意味着当您单击按钮一定次数(实际上是六次)时,新添加的字符串会被剪裁,如下所示:

“AnotherWord AnotherWord AnotherWord AnotherWord AnotherWord AnotherWo”

FontSize为13时会发生这种情况;如果你把它降低到12.7那么第六次出现“AnotherWord”的空间。我的问题是:有没有办法在运行时进行这种调整,以避免溢出?

编辑:

在问题的上下文中,StackPanel的固定宽度是强制性的 - 我们不能使用超过我们拥有的500像素。另一个要求是字体绝不能大于13。

以下是我写的所有代码:

<!-- MainWindow.xaml -->
<Window x:Class="FontSize.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525"
         DataContext="{Binding RelativeSource={RelativeSource Self}}">
    <Window.Resources>
        <DataTemplate x:Key="labelTemplate">
            <Label FontSize="13" Content="AnotherWord"></Label>
        </DataTemplate>
        <ItemsPanelTemplate x:Key="panelTemplate">
            <StackPanel Orientation="Horizontal" Width="500" Height="50" />
        </ItemsPanelTemplate>
    </Window.Resources>
    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition Height="Auto" />
            <RowDefinition Height="Auto" />
        </Grid.RowDefinitions>
            <ItemsControl Grid.Row="0" ItemsSource="{Binding Path=MyStrings}" ItemTemplate="{StaticResource labelTemplate}" 
                ItemsPanel="{StaticResource panelTemplate}" />
        <Button Grid.Row="1"  Click="Button_Click"></Button>
    </Grid>
</Window>

// MainWindow.xaml.cs
using System.Collections.ObjectModel;
using System.Windows;

namespace FontSize
{
    public partial class MainWindow
    {
        public MainWindow()
        {
            InitializeComponent();
            MyStrings = new ObservableCollection<string>();
        }

        public ObservableCollection<string> MyStrings
        {
            get { return (ObservableCollection<string>) GetValue(MyStringsProperty); }
            set { SetValue(MyStringsProperty, value); }
        }

        private static readonly DependencyProperty MyStringsProperty =
            DependencyProperty.Register("MyStrings", typeof (ObservableCollection<string>), typeof (Window));

        private void Button_Click(object sender, RoutedEventArgs e)
        {
            MyStrings.Add("AnotherWord");
        }
    }
}

1 个答案:

答案 0 :(得分:4)

ItemsControl放入Viewbox并使用以下属性:

  • MaxWidth
  • MaxHeight
  • 拉伸
  • StretchDirection

修改

删除Width&amp; Height的{​​{1}}属性。

修改2

尝试类似的东西:

StackPanel

编辑3

更改<!-- MainWindow.xaml --> <Window x:Class="FontSize.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Title="MainWindow" Height="350" Width="525" DataContext="{Binding RelativeSource={RelativeSource Self}}"> <Window.Resources> <DataTemplate x:Key="labelTemplate"> <Label FontSize="13" Content="AnotherWord"></Label> </DataTemplate> <ItemsPanelTemplate x:Key="panelTemplate"> <StackPanel Orientation="Horizontal"/> </ItemsPanelTemplate> </Window.Resources> <Grid> <Grid.RowDefinitions> <RowDefinition Height="Auto" /> <RowDefinition Height="Auto" /> </Grid.RowDefinitions> <Viewbox Grid.Row="0" MaxWidth="500" Stretch="Uniform"> <ItemsControl ItemsSource="{Binding Path=MyStrings}" ItemTemplate="{StaticResource labelTemplate}" ItemsPanel="{StaticResource panelTemplate}" /> </Viewbox> <Button Grid.Row="1" Click="Button_Click"></Button> </Grid> </Window> 的水平对齐方式,使其不会拉伸以填充网格。我把“中心”换成了你想要的任何东西。

Viewbox