Если мне нужно 60 элементов управления изображениями в моем приложении, я обязательно должен иметь 60 таких огромных блоков кода? - PullRequest
2 голосов
/ 10 января 2010

Кто-то предложил мне использовать это в качестве анимации:

<Window x:Class="WpfApplication.Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="Window1" Height="600" Width="600">
<Window.Resources>
    <Storyboard x:Key="ScaleImageStoryboard">
        <DoubleAnimation Duration="0:0:0.2" From="1" To="1.2" AutoReverse="True"
                         Storyboard.TargetName="ScaleImage" Storyboard.TargetProperty="ScaleX"/>
        <DoubleAnimation Duration="0:0:0.2" From="1" To="1.2" AutoReverse="True" 
                         Storyboard.TargetName="ScaleImage" Storyboard.TargetProperty="ScaleY"/>
    </Storyboard>
</Window.Resources>
<Grid>
    <Image Name="Image" Source="C:\Users\Public\Pictures\Sample Pictures\Desert.jpg" 
           Stretch="Fill" Width="300" Height="300"
           RenderTransformOrigin="0.5, 0.5">
        <Image.RenderTransform>
            <ScaleTransform x:Name="ScaleImage"/>
        </Image.RenderTransform>
        <Image.Triggers>
            <EventTrigger RoutedEvent="Image.MouseDown">
                <BeginStoryboard Storyboard="{StaticResource ScaleImageStoryboard}"/>
            </EventTrigger>
        </Image.Triggers>
    </Image>
</Grid>

Обратите внимание, что одно объявление Image в XAML превышает 6 строк!: D Есть ли способ для меня, чтобы создать намного более чистый XAML, не нарушая эту функциональность?

Ответы [ 3 ]

7 голосов
/ 10 января 2010

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

<Window.Resources>

    <Style x:Key="imageStyle" TargetType="{x:Type Image}">

        <Setter Property="RenderTransform">
            <Setter.Value>
                <ScaleTransform />
            </Setter.Value>
        </Setter>

        <Setter Property="RenderTransformOrigin" Value="0.5, 0.5" />

        <Style.Triggers>
            <EventTrigger RoutedEvent="Image.MouseDown">
                <BeginStoryboard>
                    <Storyboard>
                        <DoubleAnimation Duration="0:0:0.2" From="1" To="1.2" AutoReverse="True"
                                     Storyboard.TargetProperty="RenderTransform.ScaleX"/>
                        <DoubleAnimation Duration="0:0:0.2" From="1" To="1.2" AutoReverse="True" 
                                     Storyboard.TargetProperty="RenderTransform.ScaleY"/>
                    </Storyboard>
                </BeginStoryboard>
            </EventTrigger>
        </Style.Triggers>

    </Style>

</Window.Resources>

Затем вы можете использовать этот стиль для всех ваших изображений:

<Image Name="Image"
       Source="C:\Users\Public\Pictures\Sample Pictures\Desert.jpg" 
       Stretch="Fill" Width="300" Height="300"
       Style="{StaticResource imageStyle}" />

Примечание: я не тестировал, может потребоваться несколько модификаций ...

2 голосов
/ 10 января 2010

Я считаю, что ответ Томаса довольно хороший. Если вам все еще не хватает кода, вы можете создать некоторую коллекцию строк (или более сложные объекты, представляющие ваши 60 изображений), сделать ее доступной для вашего окна через какое-либо свойство и отобразить ее с помощью ItemsControl и соответствующего шаблона данных (и панели [*] 1001 * ItemsControl.ItemsPanel свойство ], если вы хотите сделать какое-то необычное позиционирование). В WPF действительно нет нужды в «старом школьном пути»;).

<Window>
  <ItemsControl ItemsSource={Binding ListOfPaths}>
    <ItemsControl.ItemTemplate>
       <DataTemplate>
         <Image Name="Image"
            Source="{Binding}" 
            Stretch="Fill" Width="300" Height="300"
            Style="{StaticResource imageStyle}" />
       </DataTemplate>
    </ItemsControl.ItemTemplate>
  </ItemsControl>
</Window>
0 голосов
/ 10 января 2010

Для подобных ситуаций, вероятно, лучше создавать объекты в исходном коде («по-старому»), но если вы предпочитаете XML, вы можете попробовать использовать XSLT для его генерации (но я не рекомендую его).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...