10

ウィンドウが大きくなるとユーザーインターフェイスが大きくなるように、ユーザーインターフェイスをスケーリングする必要があるWPFアプリケーションがあります。ダイアログの 1 つで、アイテムのリストをユーザーに提示する必要があり、ユーザーはそれらの 1 つをクリックする必要があります。リストには、1 ~ 15 ~ 20 個の項目が含まれます。個々の項目のフォント サイズを、リスト内の他の項目のフォント サイズと同じくらい大きくしたいのですが、同時に、ウィンドウを大きくするとフォント サイズも大きくしたいと考えています。

現時点では、私のテスト コードは次のようになります。

<Window x:Class="WpfApplication4.Window1"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:controls="clr-namespace:WpfApplication4"
    Title="Window1" Height="480" Width="640">


    <ScrollViewer>

        <Grid>
            <Grid.RowDefinitions>
                <RowDefinition Height="30*" MinHeight="30"/>
                <RowDefinition Height="30*" MinHeight="30"/>
                <RowDefinition Height="30*" MinHeight="30"/>
            </Grid.RowDefinitions>

            <Button Grid.Row="0" MaxHeight="100"><Viewbox><TextBlock>T</TextBlock></Viewbox></Button>
            <Button Grid.Row="1" MaxHeight="100"><Viewbox><TextBlock>Test</TextBlock></Viewbox></Button>
            <Button Grid.Row="2" MaxHeight="100"><Viewbox><TextBlock>Test Longer String</TextBlock></Viewbox></Button>

        </Grid>

    </ScrollViewer>

</Window>

アプリケーションを起動して Window を大きくすると、すべて問題ないように見えます。ウィンドウの幅を狭くすると、テキストのフォント サイズはTest Longer String小さくなりますが、Tとのフォント サイズはTest変わりません。これが発生する理由は理解しています。ビューボックスはコンテンツを最大サイズにスケーリングします。私が知りたいのは、この問題を解決するためにどのような方法を使用する必要があるかです。

コントロールに特定のフォント サイズを指定したくありません。640x480 などの低解像度の画面でこれを実行する人もいれば、より大きなワイドスクリーンを使用する人もいるからです。

編集:

コードを次のように変更しようとしました。

<ScrollViewer>
    <Viewbox>
        <ItemsControl>
            <Button>Test 2</Button>
            <Button>Test 3</Button>
            <Button>Test 4 afdsfdsa fds afdsaf</Button>
            <Button>Test 5</Button>
            <Button>Test 5</Button>
            <Button>Test 5</Button>
            <Button>Test 5</Button>
            <Button>Test 5</Button>
        </ItemsControl>
    </Viewbox>
</ScrollViewer>

ただし、ボタンの境界線のサイズも大きくなるため、大画面ではボタンの境界線の幅が 1 センチメートルになります。

4

4 に答える 4

0

この回避策が役立つ場合があります。

    <ScrollViewer>
    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition Height="30*" MinHeight="30"/>
            <RowDefinition Height="30*" MinHeight="30"/>
            <RowDefinition Height="30*" MinHeight="30"/>
        </Grid.RowDefinitions>

        <Button Grid.Row="0" MaxHeight="100">
            <Viewbox>
                <TextBlock Width="{Binding ElementName=tbLonger,Path=ActualWidth}">T</TextBlock>
            </Viewbox>
        </Button>
        <Button Grid.Row="1" MaxHeight="100">
            <Viewbox>
                <TextBlock Width="{Binding ElementName=tbLonger,Path=ActualWidth}">Test</TextBlock>
            </Viewbox>
        </Button>
        <Button Grid.Row="2" MaxHeight="100">
            <Viewbox>
                <TextBlock Name="tbLonger">Test Longer String</TextBlock>
            </Viewbox>
        </Button>
    </Grid>
</ScrollViewer>

重要なのは、すべてのテキストブロックを同じ幅に設定することです。この場合、それらはすべてバインディングによって最も長いテキストブロックに従います。

于 2010-03-03T02:55:36.113 に答える
0

これを試してください: いつものようにテキスト項目をレンダリングします:

  • TextBlock'ItemsControl' に含まれていますか?
  • ListBox?

シバン全体を に配置ViewBoxし、必要に応じてスケーリングするように設定します。水平、垂直、または組み合わせたスケーリング プロパティを探します。

于 2009-11-10T11:38:42.830 に答える
-1

最も簡単な方法は、おそらくデコレーターを構築してその仕事を行うことです。「VerticalStretchDecorator」などと呼ぶこともできます。

使用方法は次のとおりです。

<UniformGrid Rows="3" MaxHeight="300">
  <Button>
    <my:VerticalStretchDecorator>
      <TextBlock>T</TextBlock>
    </my:VerticalStretchDecorator>
  </Button> 
  <Button>
    <my:VerticalStretchDecorator>
      <TextBlock>Test</TextBlock>
    </my:VerticalStretchDecorator>
  </Button> 
  <Button>
    <my:VerticalStretchDecorator>
      <TextBlock>Test Longer String</TextBlock>
    </my:VerticalStretchDecorator>
  </Button>
</UniformGrid>

UniformGridの代わりに使用しましGridたが、 と同じように機能しGridます。

次のように実装されます。

public class VerticalStretchDecorator : Decorator
{
  protected override Size MeasureOverride(Size constraint)
  {
    var desired = base.Measure(constraint);
    if(desired.Height > constraint.Height || desired.Height==0)
      LayoutTransform = null;
    else
    {
      var scale = constraint.Height / desired.Height;
      LayoutTransform = new ScaleTransform(scale, scale); // Stretch in both directions
    }
  }
}
于 2010-03-03T20:06:11.953 に答える