2012-04-25 16 views
2

私は2つのラベルを配置しています。WPF/XAML同じ長さのテキストを保持しながら異なる長さのテキストを含む2つのラベルのレイアウトフォントスケーリング

ラベル1枚のラベル2

各ラベルの内容は常に異なるものになる、最も頻繁に2以上の文字を持っていますラベルが、私は、ウィンドウのサイズが変更されるように、コンテンツが拡大したいと私はラベルのフォントサイズをしたいです1とラベル2は一貫性を保ちます。

長すぎると、ラベル2の内容が切り取られても問題ありません。私は2つの列を持つグリッドを使用してみましたし、ViewBoxを内側にラベルを配置した

:これで

<Viewbox Margin="0,0,0,0" VerticalAlignment="Top" HorizontalAlignment="Left"> 
    <Label Margin="0,0,0,0" Content="{Binding Path=Suburb}"/> 
</Viewbox> 

問題は、位置が右になることはありませんされ、フォントサイズが一貫していません。

これを達成するための最適なレイアウト方法は何ですか?バインドでフォントサイズを同期できますか?私はLabel 2のFontSizeプロパティをLabel 1のFontSizeにバインドしようとしましたが、実際にフォントがどれくらい大きくても小さくても毎回12を返すので動作しません(実際のFontSizeは計算されていないと仮定していますラベルはViewBox内にあります)。

提案がありますか?

おかげ

答えて

2

以下のようTextBlockを使用しませんどんなサイズにしてもそれをスケールすることができます。 2番目のTextBlockにはMaxWidthを指定できます。サイズはピクセル単位で制限されます。

DockPanelの代わりに、ColumnDefinitionsと異なるGridを使用しても同じ効果を得ることができます。

重要なことは、それらがすべて同じであることです。Viewbox(結果として、FontSizeは同期されませんが、それに含まれるすべてのビジュアルスケーリングが実行されます)。

+0

ありがとう、面白そうに見える - 私は今これを撃つだろう。 – Ben

+0

私が何をしたかは100%ではありませんが、おそらく十分な結果が得られます。オーバーハングする文字をトリムするために2番目のテキストボックスを得る方法を考えることができますか?2番目と1番目の両方に多くのテキストがある場合、フォントは無限にスケールダウンされます。可能であれば最小フォントサイズ。 – Ben

+0

私が言ったように、私が考えることができる唯一の方法は、MaxWidthを設定することですが、それはそれに固定された制限を与えるでしょう。あなたがこのことを拡大するために使用したいアルゴリズムを正式化することができれば、おそらくもっと良い答えを提供することができます。 –

0

次のマークアップはOKのようだ:

<Grid> 
    <Grid.RowDefinitions> 
     <RowDefinition Height="Auto" /> 
     <RowDefinition /> 
    </Grid.RowDefinitions> 
    <Grid.ColumnDefinitions> 
     <ColumnDefinition /> 
     <ColumnDefinition /> 
    </Grid.ColumnDefinitions> 
    <Viewbox> 
     <Label Content="Label 1" Width="{Binding ActualWidth, ElementName=label2}"/> 
    </Viewbox> 
    <Viewbox Grid.Column="1"> 
     <Label Name="label2" Content="Label 2 Label 2 Label 2"/> 
    </Viewbox> 
</Grid> 
+0

ウィンドウのサイズを変更すると同時に、ラベル2の内容がラベル1より長くなるように調整してください。 "ラベル2ラベル2ラベル2"。サイズを変更すると、フォントサイズは両方のラベルで同じになりますか? – Ben

+0

あなたを誤解して申し訳ありません。私はそれを得て固定した。私の書いた返信をご覧ください – EvAlex

+0

私が見る問題は、ラベル1の幅がラベル2の幅と同じになるため、それらの間に必要以上のスペースがあることです。ラベル1の後ろに空白のヒープがあります。 – Ben

0

イム「ウィンドウのサイズが変更とコンテンツの規模」と「フォントサイズが一貫して」何の100%確実ではないactuall手段が、私は利用可能なスペースに応じてトリミングする各ラベルをしたいと思います。第二の標識がViewboxので、トリミングしない飽きないだろうと

<Viewbox VerticalAlignment="Top"> 
    <DockPanel> 
    <TextBlock Text="Second" DockPanel.Dock="Right" /> 
    <TextBlock Text="First" /> 
    </DockPanel> 
</Viewbox> 

注コンテンツをレンダリングすることが可能になる:

、なぜあなたは、次のアプローチを使用することができます

<Grid> 
    <Grid.ColumnDefinitions> 
     <ColumnDefinition Width="Auto" /> 
     <ColumnDefinition Width="Auto" /> 
    </Grid.ColumnDefinitions> 
    <TextBlock Text="{Binding Path=Suburb}" TextWrapping="NoWrap" TextTrimming="CharacterEllipsis" Margin="0,0,5,0" /> 
    <TextBlock Text="{Binding Path=Area}" TextWrapping="NoWrap" TextTrimming="CharacterEllipsis" Grid.Column="1"/> 
</Grid> 
+0

スケーリング - ウィンドウのサイズが大きくなったり、大きなモニターで開くと、ウィンドウ内のコンテンツは比例して大きくなります。同様に、ウィンドウが小さい場合、ウィンドウ内のコンテンツはそれに比例して小さくなるはずです。 – Ben

+0

しかし、フォントサイズを同じにしなければならない場合は、実際に拡大縮小するのではなく、使用可能なスペースにテキストをトリミングする –

+0

しかし、ラベル2のテキストをトリミングするのは、テキストの長さが使用可能なスペースを超える場合に限られます。フォントのスケーリングが重要なのは、アプリケーションを384x683のように開いたときに、より小さなフォントでなければならないということです。比較すると、768x1366と1080x1920で開かれます。設定されたフォントサイズを適用するだけでは、要件を満たしません。 – Ben

0

この質問は古いですが、これを行うより正確な方法の1つは、の実行を使用することです。

実行は、TextBlock内のテキストのセクションです。

<TextBlock Margin="0,0,0,0" VerticalAlignment="Top" HorizontalAlignment="Left"> 
    <Run Text="{Binding Suburb}" /> 
    <Run Text="{Binding Area}" /> 
</TextBlock> 

あなたは、間に隙間なく背中合わせに2つのランを持っていると思った場合、あなたはこのような何かをするだろうので、TextBlockの中のすべてが空白に敏感であることに注意してください:

<TextBlock Margin="0,0,0,0" VerticalAlignment="Top" HorizontalAlignment="Left"> 
    <Run Text="Foo" /><Run Text="bar" /> 
    <!-- Prints 'Foobar' --> 
</TextBlock> 

HTMLと同じように、タグ間に空白があると、その要素の間にページ上に1つのスペースが表示されます。このルールは、内のTextBlockにのみ適用され、XAMLページ全体には適用されません。

関連する問題