1

ウィンドウサイズによっては、すべてのグリッドが小さくて非常に大きくなる可能性がありますが、大きなグリッドサイズでは、内部のテキストが非常に小さく見えます。

私の現在のアイデア(しかし、それを実現する方法はまだわかりません)は、すべてのグリッド要素のバインディングを単一のフォントにしてから、フォントサイズを次のように変更することです。

override void OnRender(DrawingContext dc) {

ウィンドウサイズによって異なります。

問題は、このアイデアは正気であり、他の方法はありますか?

4

3 に答える 3

1

内部要素にフォントを明示的に設定していない場合、それらは親フォントを継承します。したがって、親要素の1つ(たとえば、Windowそれ自体またはGrid)のフォントサイズを変更できます。これにより、フォントサイズを明示的に指定していないすべての内部要素のフォントサイズが変更されます。

ただし、フォントのサイズが異なる場合、私の意見では、要素のフォントサイズを親ウィンドウのフォントサイズにバインドし、値コンバーターを使用してフォントサイズを拡大縮小するのが最善の解決策です。

次のように値コンバーターを定義します。

using System;
using System.Windows.Data;

namespace WPFTest
{
    public class FontSizeConverter : IValueConverter
    {
        public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
        {
            if (value == null)
                return null;
            double windowFontSize = (double)value;
            var scale = System.Convert.ToDouble(parameter);
            return windowFontSize * scale;
        }

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

そしてそれをあなたのxamlで使用してください:

<Window x:Class="WPFTest.Window1"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:test="clr-namespace:WPFTest"
        Title="Window1" Height="300" Width="300" FontSize="20" x:Name="window1">
    <Window.Resources>
        <test:FontSizeConverter x:Key="fontSizeConverter"/>
    </Window.Resources>
    <Grid>
        <StackPanel Grid.Row="0" Grid.Column="0">
            <TextBlock
                FontSize="{Binding ElementName=window1, Path=FontSize, Converter={StaticResource ResourceKey=fontSizeConverter}, ConverterParameter=1.5}">
                Text 1
            </TextBlock>
            <TextBlock FontSize="{Binding ElementName=window1, Path=FontSize, Converter={StaticResource ResourceKey=fontSizeConverter}, ConverterParameter=0.7}">
                Text 2
            </TextBlock>
            <TextBlock >Text 3</TextBlock>
        </StackPanel>
    </Grid>
</Window>

ConverterParameterウィンドウに関連する要素のフォントの縮尺として使用されます(ElementNameバインディングのプロパティで指定されます)。

この例では、最初のフォントTextBlockはウィンドウのフォントの150%であり、2番目のフォントはTextBlockウィンドウの70%です。3つ目TextBlockは、ウィンドウのフォントサイズに従います。

于 2012-04-15T10:50:05.980 に答える
0

robertherが提案したように、私はこのソリューションがもっと好きです。それはより安っぽくてきれいです。

<Viewbox>
    <TextBlock Text="Hello World" />
</Viewbox>
于 2012-04-15T12:51:43.087 に答える
0

これは古い投稿であることは知っていますが、トピックを検索したときに最初に出てきたものの1つだったので、これが私の解決策です。

私は最近、テキストボックスを操作し、画面に対してコンテンツのフォントサイズをスケーリングするプロジェクトでこれを行いました。このために、整数値を設定し、フォントサイズをバインドしました。

私の場合、画面の高さは800x650から始まり、フォントをデフォルトでサイズ12にしたかったので、整数値(_ScaledFontSize)をWindowHeight /(650/12)に設定しました。

画面サイズが変更されるたびに、フォントサイズを再計算する関数が呼び出され、プロパティ変更イベントが呼び出されます。この関数では、次のような単純なものを使用して、最小および最大フォントサイズの制約を追加できます。

//Set a minimum font size
if(_ScaledFontSize < 12)
    _ScaledFontSize = 12;

このスケーリングされたサイズを適用するには、フォントサイズをスケーリングするすべてのコントロールをScaledFontSizeプロパティにバインドする必要があります。

最終結果:

アプリケーション起動時のテキスト

約1920x1080のテキスト(フルスクリーンではないため、少し小さくなります)

私はしばらくの間このようなものを見つけるのに苦労していました、そして結局これは私が行ったものです。幸い、コードは非常に単純です 。MainWindow.xaml.cs:

using System.Windows;
using System.ComponentModel;

namespace FontScaling
{
    public partial class MainWindow : Window, INotifyPropertyChanged
    {
        public event System.ComponentModel.PropertyChangedEventHandler PropertyChanged;

        private int _ScaledFontSize;

        public int ScaledFontSize
        {
            get => _ScaledFontSize;
            set => _ScaledFontSize = value;
        }

        public void PropChange(string name)
        {
            System.ComponentModel.PropertyChangedEventArgs propertyChangedEvt = new System.ComponentModel.PropertyChangedEventArgs(name);

            if (PropertyChanged != null)
            {
                PropertyChanged.Invoke(this, propertyChangedEvt);
            }

        }
        public MainWindow()
        {
            InitializeComponent();
            _ScaledFontSize = (int)Application.Current.MainWindow.Height / 54;
        }

        private void Window_SizeChanged(object sender, SizeChangedEventArgs e)
        {
            _ScaledFontSize = (int)Application.Current.MainWindow.ActualHeight / 54;
            PropChange("ScaledFontSize");
        }
    }
}

MainWindow.xaml:

<Window x:Class="FontScaling.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:FontScaling"
        mc:Ignorable="d"
        Title="MainWindow" Height="650" Width="800"
        SizeChanged="Window_SizeChanged"
        Name="_This">
    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition Height="10*"/>
            <RowDefinition Height="10*"/>
            <RowDefinition Height="10*"/>
            <RowDefinition Height="200*"/>
        </Grid.RowDefinitions>

        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="15*"/>
            <ColumnDefinition Width="10*"/>
            <ColumnDefinition Width="1*"/>
            <ColumnDefinition Width="10*"/>
            <ColumnDefinition Width="15*"/>
        </Grid.ColumnDefinitions>

        <TextBlock 
            VerticalAlignment="Bottom"
            Grid.Row="1"
            Grid.Column="1"
            Text="Non Scaled TextBlock"/>
        <TextBox 
            Grid.Row="2"
            Grid.Column="1" 
            Text="Non Scaled Text"/>

        <TextBlock
            VerticalAlignment="Bottom"
            Grid.Row="1"
            Grid.Column="3" 
            Text="Scaled TextBlock"
            FontSize="{Binding ScaledFontSize, ElementName=_This}"/>
        <TextBox 
            Grid.Row="2" 
            Grid.Column="3" 
            Text="Scaled TextBox"
            FontSize="{Binding ScaledFontSize, ElementName=_This}"/>
    </Grid>
</Window>
于 2020-07-07T22:39:48.093 に答える