2015-01-04 4 views
1

Возможно ли установить максимальный масштаб содержимого в ViewBox? Если у меня есть этот код, например, я хочу, чтобы убедиться, что текст не масштабируется более чем на 200%Установить максимальный масштаб ViewBox

<Grid> 
    <Viewbox> 
     <TextBox Text="Hello world" /> 
    </Viewbox> 
</Grid> 

ответ

1

Вам нужно установить MaxWidth и MaxHeight на ViewBox:

<Grid> 
    <Viewbox x:Name="MyViewBox"> 
     <TextBox x:Name="MyTextBox" Text="Hello world" /> 
    </Viewbox> 
</Grid> 

и в код :

MyViewBox.MaxWidth = MyTextBox.ActualWidth * 2d; 
MyViewBox.MaxHeight = MyTextBox.ActualHeight * 2d; 

Или, может быть, лучшее решение с преобразователем:

public class ViewBoxMaxWidthOrHeightConverter : IValueConverter 
{ 

    public object Convert(object value, System.Type targetType, object parameter, System.Globalization.CultureInfo culture) 
    { 
     double textBoxWidthOrHeight = (double) value; 
     return textBoxWidthOrHeight*2d; 
    } 

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

и XAML:

<local:ViewBoxMaxWidthOrHeightConverter x:Key="ViewBoxMaxWidthOrHeightConverter"/> 
       <Grid> 
        <Viewbox x:Name="MyViewBox" 
          MaxWidth="{Binding ElementName=MyTextBox, Path=ActualWidth, Converter={StaticResource ViewBoxMaxWidthOrHeightConverter}, Mode=OneWay}" 
          MaxHeight="{Binding ElementName=MyTextBox, Path=ActualHeight, Converter={StaticResource ViewBoxMaxWidthOrHeightConverter}, Mode=OneWay}"> 
         <TextBox x:Name="MyTextBox" Text="Hello world" /> 
        </Viewbox> 
       </Grid> 
+0

Спасибо :-). Это было элегантное и легкое решение. – PEK

2

Для будущих читателей, я написал еще более элегантный подход, основанный на ответ user2250152, что использует вложенное свойство:

public static class ViewboxExtensions 
{ 
    public static readonly DependencyProperty MaxZoomFactorProperty = 
     DependencyProperty.Register("MaxZoomFactor", typeof(double), typeof(ViewboxExtensions), new PropertyMetadata(1.0, OnMaxZoomFactorChanged)); 

    private static void OnMaxZoomFactorChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) 
    { 
     var viewbox = d as Viewbox; 
     if (viewbox == null) 
      return; 
     viewbox.Loaded += OnLoaded; 
    } 

    private static void OnLoaded(object sender, RoutedEventArgs e) 
    { 
     var viewbox = sender as Viewbox; 
     var child = viewbox?.Child as FrameworkElement; 
     if (child == null) 
      return; 

     child.SizeChanged += (o, args) => CalculateMaxSize(viewbox); 
     CalculateMaxSize(viewbox); 
    } 

    private static void CalculateMaxSize(Viewbox viewbox) 
    { 
     var child = viewbox.Child as FrameworkElement; 
     if (child == null) 
      return; 
     viewbox.MaxWidth = child.ActualWidth * GetMaxZoomFactor(viewbox); 
     viewbox.MaxHeight = child.ActualHeight * GetMaxZoomFactor(viewbox); 
    } 

    public static void SetMaxZoomFactor(DependencyObject d, double value) 
    { 
     d.SetValue(MaxZoomFactorProperty, value); 
    } 

    public static double GetMaxZoomFactor(DependencyObject d) 
    { 
     return (double)d.GetValue(MaxZoomFactorProperty); 
    } 
} 

Прилагаемый свойство может быть добавлено в виде:

<Viewbox extensions:ViewboxExtensions.MaxZoomFactor="2.0">...</Viewbox> 
+0

Мне не удалось заставить это работать. Есть ошибочные? в методе OnLoaded, и когда я добавляю вложенное свойство, я получаю ошибку «Тип ViewboxExtensions» должен быть получен из DependencyObject ». Но если я добавлю это наследование, то получаю: «Статический класс« ViewboxExtensions »не может быть получен из типа« DependencyObject ». Статические классы должны выводиться из объекта». Я не знаю WPF достаточно хорошо, чтобы пройти мимо этого. –

+0

О, я думаю, что написал этот фрагмент для UWP, поэтому вполне возможно, что он не работает с WPF. Не смотрел на тег исходного вопроса ... Возможно, вы сможете преобразовать это в WPF, если узнаете, как вложенные свойства ведут себя по-разному в UWP и WPF. К сожалению, я нахожусь в отпуске и не имею машины со мной, что позволяет разрабатывать Windows. ? правильное использование в C# 6 и называется оператором с нулевым условием. – SebastianR

+0

О, спасибо за ответ! Я недостаточно разбираюсь в этих рамках, чтобы понять различия, но это не критично. –

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