Frage WPF Label passt FontSize an seine Breite und Höhe an


Ich muss ein entwickeln Label Kontrolle in WPF, auf .NET 3.5 und VisualStudio 2010, in dem die FontSize wird automatisch den Text füllen den Kontrollbereich.

Ich weiß nicht, ob ich eine erstellen sollte CustomControl erben von Label oder wenn ich eine erstellen soll UserControl welches enthält a Label Steuerung.

Ich habe ein Beispiel hier mit einem gesehen ValueConverter, aber ich verstehe sein Verhalten hier nicht: Ändern Sie die Schriftgröße dynamisch.

Kann mir jemand einen Hinweis geben?

Aktualisieren: 

Ich fand die Lösung mit der DoubleConverter aus dem Beispiel, das ich vorher gepostet habe:

Die Seele benutzt ein ValueConverter, die ich aus dem Beispiel extrahiert, aber NumerFormat IFormatProvider hinzugefügt, um "0.1" Wert korrekt zu analysieren, fand ich bei Dezimal d1 = Dezimal.Parese ("0.1"); // = 1?!?:

 [ValueConversion(typeof(object), typeof(double))]
 public class DoubleConverter : IValueConverter
 {
  public object Convert(object value, Type targetType,
   object parameter, CultureInfo culture)
  {
   double dblValue = (double)value;
   double scale = Double.Parse(((string)parameter), System.Globalization.CultureInfo.InvariantCulture.NumberFormat);
   return dblValue * scale;
  }

  public object ConvertBack(object value, Type targetType,
   object parameter, CultureInfo culture)
  {
   throw new NotImplementedException();
  }
 }

Dann müssen Sie in XAML die Instanz instanziieren DoubleConverter, und geben Sie die Bindung in der FonSize Eigentum:

<UserControl x:Class="<Namespace>.LabelAutoFontSize"
  xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
  xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
  xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
  xmlns:me="clr-namespace:<Namespace>"
  mc:Ignorable="d" 
  d:DesignHeight="60" d:DesignWidth="278">
 <UserControl.Resources>
 <me:DoubleConverter x:Key="doubleConverter" />
 </UserControl.Resources>
 <Grid>
 <Label
  x:Name="lbl"
  FontSize="{
   Binding Path=Width,
    RelativeSource={RelativeSource AncestorType={x:Type UserControl}},
   Converter={StaticResource doubleConverter},
   ConverterParameter=0.116}"

  VerticalAlignment="Stretch"
  HorizontalAlignment="Stretch"
  Content="LabelAutoFontSize"
  d:LayoutOverrides="Width"
  HorizontalContentAlignment="Center"
  VerticalContentAlignment="Center" />
 </Grid>
</UserControl>

Ein wichtiger Punkt ist, dass der Wert für ConverterParameter hängt absolut von der zugewiesenen Schriftart ab. Jede Schriftart benötigt möglicherweise einen anderen Wert und Sie müssen "herumspielen", um den richtigen Wert zu erhalten, der genau passt.


9
2017-07-12 14:11


Ursprung


Antworten:


<Viewbox>
    <TextBlock>asd</TextBlock>
</Viewbox>

Macht auch den Job.


27
2017-09-12 18:09