2009-11-10 2 views
8

У меня есть приложение WPF, где пользовательский интерфейс должен быть масштабирован так, чтобы он стал больше, если окна стали больше. В одном из диалогов мне нужно представить список предметов пользователю, и пользователь должен нажать на один из них. Список будет содержать от 1 до 15-20 пунктов. Я хочу, чтобы размер шрифта для каждого отдельного элемента был таким же большим, как размер шрифта для других элементов в списке, но в то же время я хочу, чтобы размер шрифта увеличивался, если окно стало больше.Расширение шрифта WPF

На данный момент мой тестовый код выглядит ниже.

<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> 

Если приложение запущено и Окно сделано широким, все выглядит нормально. Если ширина окна уменьшается, размер шрифта Test Longer String делается меньше, но размер шрифта для T и Test остается неизменным. Я понимаю, почему это происходит - окно просмотра масштабирует содержимое до максимального размера. Я хочу знать, какой метод я должен использовать для решения этой проблемы.

Я не хочу давать контроль определенным размерам шрифта, потому что некоторые люди будут запускать это на экранах с низким разрешением, например 640x480, а другие будут использовать более крупные широкоформатные экраны.

EDIT:

Я попытался изменить свой код на следующее:

<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> 

Но с размером кнопки границы увеличиваются, так что на больших экранах границы кнопок становятся сантиметрами шириной.

ответ

0

Попробуйте это: Рендер текстовых элементов, как вы могли бы сделать это в любое другое время:

  • TextBlock изложенного в «ItemsControl»?
  • ListBox?

Поместите весь shebang в ViewBox и установите его в соответствии с вашими требованиями. Посмотрите на горизонтальные, вертикальные или комбинированные масштабирующие свойства.

+0

Я обновил сообщение. См. Раздел «Редактировать». Короче говоря, если я использую TextBlock, а не Button, я теряю интерфейс «Button» -user (эффект клика и т. Д.). Если я использую кнопку и помещаю ее в окно просмотра, вся кнопка, включая ее границу, будет изменена. Я не хочу, чтобы рамка на 1 см была только потому, что программа максимизирована. – Martin

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> 

Ключ установить все TextBlocks одинаковую ширину. В этом случае все они следуют за самым длинным текстовым блоком посредством привязки.

+0

Я считаю, что код OP не имеет проблемы с шириной кнопок, они имеют одинаковую длину, когда окно становится меньше, но он хочет, чтобы fontsize был одинаковым (или это то, что я подразумеваю). Таким образом, привязка должна быть связана с шрифтом самого длинного текста. –

-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 
    } 
    } 
} 
+0

Этот код не компилируется вообще. Measure() возвращает void и нет значения возврата из MeasureOverride() – Bob

0

Я должен был сделать разрешение самостоятельное приложение, и сделал это с этим ответом здесь: tips on developing resolution independent application

с, что приложение масштабирования (или масштабирование), в зависимости от разрешения.

Смежные вопросы