2013-03-11 2 views
0

Что я хочу получить, это любой способ сделать масштабирование коллекции элементов управления, но сохранить ширину, высоту и положение для подмножества этих элементов управления. Я видел вопрос How to keep element size while WPF zoom in and out?, кажется очень к тому, что я хочу, но на него не ответил, а также не очень явный, так что это улучшит вопрос.WPF Zoom, но сохраняя некоторые элементы ширины, высоты и положения

В настоящее время я использую элемент управления Zoombox, который поставляется с WPF Toolkit для .NET Framework 4.0, но я могу его изменить. Структура, что у меня есть следующие:

<Border x:Name="drawRegionBorder" Grid.Column="1" Grid.Row="1" d:LayoutOverrides="Width, Height" BorderThickness="1" CornerRadius="4" BorderBrush="{StaticResource BorderBrush}" > 
     <xctk:Zoombox x:Name="zoomBox"> 
      <Grid x:Name="drawRegion" Height="{Binding Height}" Width="{Binding Width}" HorizontalAlignment="Left" VerticalAlignment="Top" Background="{DynamicResource DrawBackgroundBrush}"> 
       <Image Source="{Binding Image}" ... /> 
       <ListBox x:Name="points" ItemsSource="{Binding Points}"> 
        <ListBox.Template> 
         <ControlTemplate> 
          <Canvas IsItemsHost="True"/> 
         </ControlTemplate> 
        </ListBox.Template> 
       </ListBox> 
       <ListBox x:Name="paths" ItemsSource="{Binding SomePaths}"> 
        <ListBox.Template> 
         <ControlTemplate> 
          <Canvas IsItemsHost="True"/> 
         </ControlTemplate> 
        </ListBox.Template> 
       </ListBox> 
       <!--... Others ...--> 
      </Grid> 
     </xctk:Zoombox> 
</Border> 

То, что я здесь, являются несколько списков, внутри сетки и панели элементы для каждого списка является Canvas, так что каждый ребенок (но изображение) будет находиться внутри холста, а также каждый ребенок будет устанавливать свойства Canvas.X и Canvas.Y. Так что я хочу, это любой способ сделать масштабирование (увеличение или уменьшение) и сохранить размер poitns (эллипс) или путей ...

Из-за масштабирования, это масштабное преобразование wpf, Полагаю, что, возможно, это можно сделать, когда вы увеличите масштаб изображения, сделайте уменьшение в элементе управления, которое я хочу сохранить, и наоборот.

Примером поведения spected является дизайнер blend, например, при масштабировании сетки с строками и столбцами индикаторы столбцов сохраняют исходный размер, что-то вроде того, что я хочу для своих точек и путей.

Буду признателен за любое решение, возможно, библиотеку, прикрепленное свойство, поведение или код. Thaknks

ответ

1

Дизайнер Blend использует Adorners для своих манипуляторов. Размеры рассчитываются в соответствии с масштабированием текущего увеличения. Если вы заинтересованы в использовании подобной техники, на самом деле не так сложно сделать расчет самостоятельно.

Вы должны создать adorner, установленный в Bounds вашего элемента управления, а затем применить масштабный коэффициент в соответствии с увеличением в дизайнере. Поэтому, если вы увеличиваете масштаб на 2,0, тогда вы применяете RenderTransform of Scale 2.0 к вашему увеличенному управлению, вычисляя вашего adorner как 2.0 из ActualWidth и ActualHeight увеличенного элемента управления (поскольку эти два свойства не учитывают RenderTransformations). Самое приятное в том, что, поскольку все использует двойники, вы получаете точную точность пикселей при выполнении такого расчета.

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

This учебное пособие является хорошей отправной точкой. В методе OnRender вы должны применить масштабный коэффициент (путем вычисления границ вашего adorner на основе ActualWidth/Height UIElement, а затем умножения на ваш коэффициент масштабирования). Как вы применяете своего рекламодателя, многое зависит от контекста приложения - если вы работаете с дизайнером, тогда вы хотите применить украшения в холсте дизайна или при выборе элементов.

+0

У вас есть какая-либо ссылка, где я могу увидеть код или код рядом. –

+0

Я добавил ссылку на учебник по рекламодателям с комментарием о том, как вы могли бы реализовать масштабирование. – cunningdave

+0

Спасибо, я посмотрю –

0

Я сделал исследование и нашел полезные вещи, если вы работаете с Adorners, вы можете переопределить GetDesiredTransform, чтобы установить, какое преобразование вам нужно, чтобы ваш сторонник мог сделать, здесь вы можете сделать null преобразование сделанное вашему adorner. Для получения дополнительной информации см. How to exclude scaleTransform from GeneralTransform in Adorner GetDesiredTransform method. В Msdn. Но я думаю, что если я хочу сделать это на элементах управления, мне нужно контролировать трансформирование.

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