1

メイン ウィンドウに含まれるウィンドウ、ツリー ビュー、リボン メニューなどのコントロールのフォント サイズを増減したい。

フォント サイズ スライダー作成メソッドがあり、visualtree ヘルパーを使用して Control と TextBlock のすべてにアクセスし、スライダーの値に応じてフォント サイズを増減したいと考えています。

メソッドは以下のとおりです。

 private StackPanel CreateFontSizeSlider()
 {
            StackPanel fontSizePanel = new StackPanel();
            fontSizePanel.Orientation = Orientation.Horizontal;
            Slider fontSizeSlider = new Slider();
            fontSizeSlider.Minimum = -3;
            fontSizeSlider.Maximum = 5;
            fontSizeSlider.Value = 0;
            fontSizeSlider.Orientation = Orientation.Horizontal;
            fontSizeSlider.TickPlacement = System.Windows.Controls.Primitives.TickPlacement.TopLeft;
            fontSizeSlider.IsSnapToTickEnabled = true;
            fontSizeSlider.ValueChanged += new RoutedPropertyChangedEventHandler<double>(fontSizeSlider_ValueChanged);
            fontSizeSlider.Width = 150;

            fontSizePanel.Children.Add(fontSizeSlider);
            return fontSizePanel;
        }


 public static void ChangeControlsFontSize(DependencyObject dependencyObject, double value)
 {
            foreach (DependencyObject childItem in GetChildren(dependencyObject))
            {
                if (childItem is Control)
                {
                    Control control = childItem as Control;
                    control.FontSize = control.FontSize + value;
                }
                else if (childItem is TextBlock)
                {
                    ((TextBlock)childItem).FontSize = ((TextBlock)childItem).FontSize + value;
                }
                ChangeControlsFontSize(childItem, value);
            }
        }

        private static IEnumerable<DependencyObject> GetChildren(DependencyObject reference)
        {

            int childCount = VisualTreeHelper.GetChildrenCount(reference);
            for (int i = 0; i < childCount; i++)
            {
                yield return VisualTreeHelper.GetChild(reference, i);
            }
        } 


  private void fontSizeSlider_ValueChanged(object sender, RoutedPropertyChangedEventArgs<double> e)
        {
           ChangeControlsFontSize(this, e.NewValue - e.OldValue);
        }

いくつかの問題があります。

まず、ビジュアル ツリーを歩いてすべてのコントロールにアクセスできません。たとえば、閉じたリボン メニュー項目にアクセスできません。そのため、フォントを変更することはできません。

次に、一部のコントロールには別のコントロールが含まれているため、コントロールのフォント サイズを 2 回増減します。

これらの問題の解決策はありますか、またはこれを行う別の方法はありますか? 私を手伝ってくれますか ?

4

1 に答える 1

2

あなたは一生懸命働きすぎています。:-D

次のようなスタイルを作成します。

<Style TargetType="ListBox">
    <Setter Property="FontFamily" Value="Tahoma"/>
    <Setter Property="FontSize">
        <Setter.Value>
            <Binding Source="{x:Static Application.Current}" Path="fontSize"/>
        </Setter.Value>
    </Setter>
</Style>

アプリケーションで fontSize というプロパティを作成します。

次のようなスライダーを作成します。

    <Slider Name="fontSize" Minimum="10" Maximum="22" IsSnapToTickEnabled="True"  TickPlacement="TopLeft"
            Value="{Binding Source={x:Static Application.Current}, Path=fontSize, Mode=TwoWay}"/>

これで、そのスタイルのコントロールは適切にサイズ変更されます - コードは必要ありません!

于 2010-06-23T19:24:23.380 に答える