2012-04-19 2 views
1

Я создаю средство просмотра изображений с двумя визуальными состояниями.Динамически масштабируемые объекты, когда визуальное состояние активно

А) базовое приложение состояние (отсутствие VisualState активного)

1) "базовое" состояние (VisualState, пустой раскадровка)

2) "сетки" со всеми изображениями (VisualState, что весы изображений на четверть размер)

Я хочу изменить между визуальными состояниями с помощью жестов. В настоящее время это делается при нажатии на изображение. Я также хочу, чтобы жест щепотки масштабировал изображение, когда я зажимал (OnPinchDelta). Это работает только в A) нет визуального состояния. Как только я запускаю визуальное состояние 1) или 2) сжимание перестает работать. Он по-прежнему запускает визуальное изменение, но не масштабирует изображение , а сжимает.

Как изменить масштаб изображения при активном визуальном состоянии или как я могу выйти из любого активного визуального состояния, чтобы не работать с визуальным представлением/раскадрой (I think the latter is impossible)?

Причина, по которой защемление больше не масштабирует изображение, а защемление - это потому, что оно каким-то образом конфликтует с визуальным пространством. При запуске приложения все работает, но как только визуальное состояние активировано, оно больше не работает. Если при запуске приложения я установил визуальное состояние в 1) он не работает даже один раз.

EDIT: Я построил упрощенный пример. Вот соответствующий XAML (копия пасты остальные не работали, но в остальном это просто шаблон страницы WP по умолчанию со ссылкой инструментарием):

<!--LayoutRoot is the root grid where all page content is placed--> 
<Grid x:Name="LayoutRoot" Background="Transparent"> 
    <VisualStateManager.VisualStateGroups> 
     <VisualStateGroup x:Name="VisualStateGroup"> 
      <VisualState x:Name="Normal"/> 
      <VisualState x:Name="Grid"> 
       <Storyboard> 
        <DoubleAnimation Duration="0" To="0.3" Storyboard.TargetProperty="(UIElement.RenderTransform).(CompositeTransform.ScaleX)" Storyboard.TargetName="image" d:IsOptimized="True"/> 
        <DoubleAnimation Duration="0" To="0.3" Storyboard.TargetProperty="(UIElement.RenderTransform).(CompositeTransform.ScaleY)" Storyboard.TargetName="image" d:IsOptimized="True"/> 
       </Storyboard> 
      </VisualState> 
     </VisualStateGroup> 
    </VisualStateManager.VisualStateGroups> 

    <Grid x:Name="ContentPanel" Grid.Row="1" Margin="12,0,12,0"/> 
    <Image x:Name="image" Source="cheetah-picture.jpg" Stretch="Uniform" VerticalAlignment="Top"> 
     <Image.RenderTransform> 
      <CompositeTransform x:Name="ImageTransformation"/> 
     </Image.RenderTransform> 
     <toolkit:GestureService.GestureListener> 
      <toolkit:GestureListener PinchDelta="OnPinchDelta" PinchCompleted="OnPinchCompleted" /> 
     </toolkit:GestureService.GestureListener> 
    </Image> 
</Grid> 

Вот .cs

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Net; 
using System.Windows; 
using System.Windows.Controls; 
using System.Windows.Documents; 
using System.Windows.Input; 
using System.Windows.Media; 
using System.Windows.Media.Animation; 
using System.Windows.Shapes; 
using Microsoft.Phone.Controls; 

namespace Pincher 
{ 
public partial class MainPage : PhoneApplicationPage 
{ 
    public MainPage() 
    { 
     InitializeComponent(); 
    } 

    private void OnPinchDelta(object sender, PinchGestureEventArgs e) 
    { 
     ImageTransformation.ScaleX = 1 * e.DistanceRatio; 
     ImageTransformation.ScaleY = ImageTransformation.ScaleX; 
    } 

    private void OnPinchCompleted(object sender, PinchGestureEventArgs e) 
    { 

     bool squeezing = (e.DistanceRatio < 1) ? true : false; 

     if (squeezing == true) 
     { 
      VisualStateManager.GoToState(this, "Grid", true); 
      MessageBox.Show("grid"); 
     } 
     else 
     { 
      VisualStateManager.GoToState(this, "Normal", true); 
      MessageBox.Show("normal"); 
     } 
    } 
} 

}

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

ответ

0

Я думаю, что проблема, с которой вы сталкиваетесь, связана с попыткой пойти base состояние. base Состояние - это состояние по умолчанию, которое используется, когда элемент управления инициализирован, но как только VSM (Visual State Manager) переходит в другое состояние, вы больше не находитесь в base и не можете вернуться к нему.

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

Кроме того, если вы бы что-то вроде стиля кнопки по умолчанию в штатах WP7, вы заметите, что он имеет Normal, MousOver, прессованных и Disabled состояния в переходных группах по умолчанию. И когда пользователь ничего не делает с кнопкой (и не отключается), он переходит на Normal состояние, не на базу!

+0

Я, очевидно, имею фактическое базовое состояние (без VSM). Затем 1) состояние GRID и 2) состояние «BASE».Вы можете позвонить последнему 2) «НОРМАЛЬНО», если хотите, но это просто семантика в отношении имени. Это состояние пустое. Проблема в том, что как только я запускаю какое-либо визуальное состояние, я больше не могу масштабировать изображение, на которое влияет состояние. Изображение просто не масштабируется, пока выполняется визуальное состояние, и поскольку вы не можете выйти из визуального состояния, я больше не могу его масштабировать, если вы каким-либо образом не нацеливаете масштаб объекта в определенном визуальном состоянии - это возможно? – Hardev

+0

Не могли бы вы разместить свой XAML (особенно бит VSM). – Vitalij

+0

Я отредактировал свое оригинальное сообщение. Теперь он включает упрощенный пример. По какой-то причине я не смог скопировать вставку полного XAML, но то, что не включено, - это только шаблон страницы WP по умолчанию. – Hardev

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