Форум программистов, компьютерный форум, киберфорум
C#: WPF, UWP и Silverlight
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.80/35: Рейтинг темы: голосов - 35, средняя оценка - 4.80
7 / 7 / 4
Регистрация: 20.06.2012
Сообщений: 129
Записей в блоге: 4
1

WPF app, верстка в XAML, сделать одну кнопку шире остальных

19.07.2012, 16:57. Показов 6627. Ответов 15
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Алоха, друзья )
Сегодня весь день изобретал велосипед собирал свой первый калькулятор. Очень увлекательное занятие - даже не заметил как пролетело время. Хотел бы прояснить один момент по поводу верстки в XAML. Я разместил кнопки калькулятора в UniformGrid сетке, все они одного размера. Но вот что если мне захочется сделать одну кнопку в два раза шире чем остальные? Например:
WPF app, верстка в XAML, сделать одну кнопку шире остальных

Кнопку "0" сделать размером с красную рамочку, то есть такую же как у всех на цифровой клавиатуре? Можно ли это сделать в UniformGrid сетке? Или надо компоновать элементы как-то по другому?

Вдогонку даю листинг MainWindow.xaml:
XML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
<Window x:Class="Calc.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:Calc="clr-namespace:Calc" Title="Calculator" Height="400
        " Width="316
        " Loaded="Window_Loaded">
    <Window.Resources>
        <ResourceDictionary>
            <ResourceDictionary.MergedDictionaries>
                <ResourceDictionary Source="CalcResources.xaml"/>
            </ResourceDictionary.MergedDictionaries>
        </ResourceDictionary>
    </Window.Resources>
    <Grid>
        <TextBlock Name="SecondDigit" Style="{StaticResource SecondDigit}"/>
        <TextBlock Name="Operator" Style="{StaticResource Operator}"/>
        <TextBlock Name="MainDigit" Style="{StaticResource MainDigit}"/>
        <UniformGrid Style="{StaticResource Keyboard}">
            <Button Content="7" Click="Button_Click_7" />
            <Button Content="8" Click="Button_Click_8" />
            <Button Content="9" Click="Button_Click_9" />
            <Button Name="div" Content="/" Click="div_Click" />
            <Button Name="sqrt" Content="SQRT" Click="sqrt_Click" />
            <Button Content="4" Click="Button_Click_4" />
            <Button Content="5" Click="Button_Click_5" />
            <Button Content="6" Click="Button_Click_6" />
            <Button Name="multi" Content="*" Click="multi_Click" />
            <Button Name="oneDivTo" Content="1/x" Click="oneDivTo_Click" />
            <Button Content="1" Click="Button_Click_1" />
            <Button Content="2" Click="Button_Click_2" />
            <Button Content="3" Click="Button_Click_3" />
            <Button Name="diff" Content="-" Click="diff_Click_1" />
            <Button Name="equal" Content="=" Click="equal_Click" />
            <Button Content="0" Grid.ColumnSpan="2"  Click="Button_Click_0" />
            <Button Name="comma" Content="," Click="Button_Click_11" />
            <Button Name="summ" Content="+" Click="summ_Click" />
            <Button Name="toNull" Content="CE" Click="toNull_Click" />
        </UniformGrid>
    </Grid>
</Window>
И CalcResources.xaml:
XML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
    <Style x:Key="NumberButton">
    </Style>
    <Style TargetType="Grid">
        <Setter Property="Grid.Background" Value="#FFE2D6D6"/>
    </Style>
    <Style x:Key="SecondDigit">
        <Setter Property="TextBlock.Height" Value="18"/>
        <Setter Property="TextBlock.VerticalAlignment" Value="Top"/>
        <Setter Property="TextBlock.Padding" Value="15,0"/>
        <Setter Property="TextBlock.Margin" Value="10,10,10,0" />
        <Setter Property="TextBlock.TextAlignment" Value="Right"/>
        <Setter Property="TextBlock.FontSize" Value="16"/>  
    </Style>
    <Style x:Key="Operator">
        <Setter Property="TextBlock.Height" Value="18"/>
        <Setter Property="TextBlock.VerticalAlignment" Value="Top"/>
        <Setter Property="TextBlock.Padding" Value="15,0"/>
        <Setter Property="TextBlock.Margin" Value="10,30,10,0" />
        <Setter Property="TextBlock.TextAlignment" Value="Right"/>
        <Setter Property="TextBlock.FontSize" Value="16"/>
    </Style>
    <Style x:Key="MainDigit">
        <Setter Property="TextBlock.Height" Value="35"/>
        <Setter Property="TextBlock.Width" Value="275"/>
        <Setter Property="TextBlock.Text" Value="0"/>
        <Setter Property="TextBlock.VerticalAlignment" Value="Top"/>
        <Setter Property="TextBlock.Padding" Value="15,0"/>
        <Setter Property="TextBlock.Margin" Value="10,50,20,0" />
        <Setter Property="TextBlock.TextAlignment" Value="Right"/>
        <Setter Property="TextBlock.FontSize" Value="32"/>
    </Style>
    <Style x:Key="Keyboard">
        <Setter Property="UniformGrid.Height" Value="260"/>
        <Setter Property="UniformGrid.Width" Value="300"/>
        <Setter Property="UniformGrid.Margin" Value="0,100,0,0"/>
        <Setter Property="UniformGrid.Columns" Value="5"/>
        <Setter Property="UniformGrid.Rows" Value="4"/>
    </Style>
    <Style TargetType="Button">
        <Setter Property="Button.Margin" Value="1" />
    </Style>
</ResourceDictionary>
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
19.07.2012, 16:57
Ответы с готовыми решениями:

Взаимодействие MainWindow.xaml.cs <->App.Xaml.cs
Я попробовал и, безусловно, оценил удобство и простоту использования WPF, поначалу казавшийся мне...

Адаптивная вёрстка - на телефоне шире, чем нужно
http://klasstdev.ru/o4kishop/ Всё хорошо, но на телефоне шире, чем нужно. Помогите, пожалуйста,...

Возможно ли в WPF App сделать MainWindow дочерним окном и открыть в его рамках другое окно?
Возможно ли в WPF App сделать MainWindow дочерним окном и открыть в его рамках другое окно...

WPF C# Сделать невидимую кнопку
Вот таким образом добавляю коллекцию кнопок: &lt;StackPanel Grid.Row=&quot;0&quot; Orientation=&quot;Horizontal&quot; ...

15
_
2364 / 1243 / 78
Регистрация: 28.10.2009
Сообщений: 4,331
19.07.2012, 18:30 2
oblomingo, UniformGrid позволяет создавать ячейки одинакового размера, поэтому если хотите объединять ячейки, то лучше использовать простой Grid
1
7 / 7 / 4
Регистрация: 20.06.2012
Сообщений: 129
Записей в блоге: 4
20.07.2012, 11:50  [ТС] 3
Eugene22, все верно. UniformGrid просто не подходит в этом конкретном случае.

Добавлено через 1 час 1 минуту
XML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<Grid>
            <Grid.RowDefinitions>
                <RowDefinition Height="25*"/>
                <RowDefinition Height="25*"/>
                <RowDefinition Height="25*"/>
                <RowDefinition Height="25*"/>
            </Grid.RowDefinitions>
            <Grid.ColumnDefinitions>
                <ColumnDefinition Width="20*"/>
                <ColumnDefinition Width="20*"/>
                <ColumnDefinition Width="20*"/>
                <ColumnDefinition Width="20*"/>
                <ColumnDefinition Width="20*"/>
            </Grid.ColumnDefinitions>
</Grid>
Можно ли избавится от повторяющегося кода? Эти 4 одинаковых <RowDefinition Height="25*"/> можно одной строчкой записать?
0
_
2364 / 1243 / 78
Регистрация: 28.10.2009
Сообщений: 4,331
20.07.2012, 12:14 4
Цитата Сообщение от oblomingo Посмотреть сообщение
Можно ли избавится от повторяющегося кода? Эти 4 одинаковых <RowDefinition Height="25*"/> можно одной строчкой записать?
Нет, это как html-файл - файл разметки. Но можно через код. правда тогда, видимо. контролы, тоже через код придется добавлять
0
7 / 7 / 4
Регистрация: 20.06.2012
Сообщений: 129
Записей в блоге: 4
27.08.2012, 13:04  [ТС] 5
Есть вот такой некрасивый код (анимированное меню из 5 кнопок):
XML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
<StackPanel DockPanel.Dock="Bottom" Orientation="Horizontal" Height="80" HorizontalAlignment="Center">
                <Button Click="Button_Click_1">
                    <Button.Template>
                        <ControlTemplate TargetType='{x:Type Button}'>
                            <Image Source="/images/api.ico" Style="{StaticResource iconImage}" />
                        </ControlTemplate>
                    </Button.Template>
                    <Button.Triggers>
                        <EventTrigger RoutedEvent="Button.Click">
                            <BeginStoryboard Storyboard="{StaticResource elementAnimation}"/>
                        </EventTrigger>
                    </Button.Triggers>
                </Button>
                <Button Click="Button_Click_2">
                    <Button.Template>
                        <ControlTemplate TargetType='{x:Type Button}'>
                            <Image Source="/images/database.ico" Style="{StaticResource iconImage}" />
                        </ControlTemplate>
                    </Button.Template>
                    <Button.Triggers>
                        <EventTrigger RoutedEvent="Button.Click">
                            <BeginStoryboard Storyboard="{StaticResource elementAnimation}"/>
                        </EventTrigger>
                    </Button.Triggers>
                </Button>
                <Button Click="Button_Click_3">
                    <Button.Template>
                        <ControlTemplate TargetType='{x:Type Button}'>
                            <Image Source="/images/float.ico" Style="{StaticResource iconImage}" />
                        </ControlTemplate>
                    </Button.Template>
                    <Button.Triggers>
                        <EventTrigger RoutedEvent="Button.Click">
                            <BeginStoryboard Storyboard="{StaticResource elementAnimation}"/>
                        </EventTrigger>
                    </Button.Triggers>
                </Button>
                <Button Click="Button_Click_4">
                    <Button.Template>
                        <ControlTemplate TargetType='{x:Type Button}'>
                            <Image Source="/images/Gear.ico" Style="{StaticResource iconImage}" />
                        </ControlTemplate>
                    </Button.Template>
                    <Button.Triggers>
                        <EventTrigger RoutedEvent="Button.Click">
                            <BeginStoryboard Storyboard="{StaticResource elementAnimation}"/>
                        </EventTrigger>
                    </Button.Triggers>
                </Button>
                <Button Click="Button_Click_5">
                    <Button.Template>
                        <ControlTemplate TargetType='{x:Type Button}'>
                            <Image Source="/images/linux.ico" Style="{StaticResource iconImage}" />
                        </ControlTemplate>
                    </Button.Template>
                    <Button.Triggers>
                        <EventTrigger RoutedEvent="Button.Click">
                            <BeginStoryboard Storyboard="{StaticResource elementAnimation}"/>
                        </EventTrigger>
                    </Button.Triggers>
                </Button>
            </StackPanel>
Можно ли его сделать компактнее/красивее/короче?
П.С. Картинка для каждой кнопки разная, обработчики по идее можно свести к одному. EventTrigger на событие Click запускает анимацию постороннего элемента и использует свойство TargetName, в стиль или шаблон кнопки такой Storyboard не загонишь.
0
burning1ife
1462 / 1284 / 293
Регистрация: 21.09.2008
Сообщений: 3,438
Записей в блоге: 9
27.08.2012, 13:14 6
создайте custom control, который наследуется от button.
добавьте dep. property, которая будет указывать путь к картинке.
создайте стиль для новой кнопки, который будет вкл. новый control template, содержащий image с template binding'ом к созданному dep. property.
0
14 / 11 / 0
Регистрация: 30.07.2012
Сообщений: 30
27.08.2012, 18:06 7
Цитата Сообщение от oblomingo Посмотреть сообщение
Есть вот такой некрасивый код (анимированное меню из 5 кнопок):[/XML]
Можно ли его сделать компактнее/красивее/короче?
П.С. Картинка для каждой кнопки разная, обработчики по идее можно свести к одному. EventTrigger на событие Click запускает анимацию постороннего элемента и использует свойство TargetName, в стиль или шаблон кнопки такой Storyboard не загонишь.

XML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<WrapPanel Width="...">
   <WrapPanel.Resources>
      <Style TargetType="Button" BasedOn="{StaticResource ...}" />
   </WrapPanel.Resources>
    <Button Content="..." Click="..."/>
    <Button Content="..." Click="..."/>
    <Button Content="..." Click="..."/>
    <Button Content="..." Click="..."/>
    <Button Content="..." Click="..."/>
    <Button Content="..." Click="..."/>
    <Button Content="..." Click="..."/>
    <Button Content="..." Click="..."/>
    <Button Content="..." Click="..."/>
    <Button Content="..." Click="..."/>
    <Button Content="..." Click="..."/>
    <Button Content="..." Click="..."/>
    <Button Content="..." Click="..."/>
    <Button Content="..." Click="..."/>
    <Button Content="..." Click="..."/>
    <Button Content="..." Click="..." Width="..."/>
    <Button Content="..." Click="..."/>
    <Button Content="..." Click="..."/>
</WrapPanel>
Это - всё. Остальное, включая анимацию - один новый стиль (или шаблон) кнопки.

Добавлено через 11 минут
P.s.
Если нужно вставлять иконки, вместо Content будет Image или контейнер для векторов, например, Rectangle. Анимация разных элементов вызывается из шаблона через Binding.
0
7 / 7 / 4
Регистрация: 20.06.2012
Сообщений: 129
Записей в блоге: 4
28.08.2012, 12:42  [ТС] 8
Цитата Сообщение от kenny69 Посмотреть сообщение
создайте custom control, который наследуется от button.
добавьте dep. property, которая будет указывать путь к картинке.
создайте стиль для новой кнопки, который будет вкл. новый control template, содержащий image с template binding'ом к созданному dep. property.
К сожалению я еще не дошел до custom controls. Честно говоря, мне было бы намного яснее если бы вы смогли показать на моем примере как это все сделать.
Весь XAML код находится в моем блоге в последнем посте. Заранее благодарен.

Добавлено через 16 минут


Что-то у меня не получается, например передать стиль для всех кнопок указав его в WrapPanel.
Весь код (целых 143 строчки), можете увидеть тут - https://www.cyberforum.ru/blog... og682.html
Я был бы очень признателен, если бы свою идею показали на живом примере переделав мой код.
0
burning1ife
1462 / 1284 / 293
Регистрация: 21.09.2008
Сообщений: 3,438
Записей в блоге: 9
28.08.2012, 13:35 9
CustomControl:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
  public class ImageButton : Button
    {
        static ImageButton()
        {
            DefaultStyleKeyProperty.OverrideMetadata(typeof(ImageButton), new FrameworkPropertyMetadata(typeof(ImageButton)));
        }
 
 
 
 
        public string ImageSource
        {
            get { return (string)GetValue(ImageSourceProperty); }
            set { SetValue(ImageSourceProperty, value); }
        }
 
        // Using a DependencyProperty as the backing store for ImageSource.  This enables animation, styling, binding, etc...
        public static readonly DependencyProperty ImageSourceProperty =
            DependencyProperty.Register("ImageSource", typeof(string), typeof(ImageButton), new FrameworkPropertyMetadata("", FrameworkPropertyMetadataOptions.AffectsRender,ImageSourceChanged));
 
 
        private static void ImageSourceChanged(DependencyObject sender, DependencyPropertyChangedEventArgs e)
        {
            Application.GetResourceStream(new Uri("pack://application:,,," + (string) e.NewValue));
        }
    }
Style with template:
XML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
  xmlns:Controls="clr-namespace:CustomControl.Controls">
    <Style TargetType="{x:Type Controls:ImageButton}">
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="{x:Type Controls:ImageButton}">
                    <Grid x:Name="Grid">
 
                        <Border x:Name="Background" Background="{TemplateBinding Background}" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" CornerRadius="3">
                            <StackPanel Orientation="Horizontal" VerticalAlignment="Center" HorizontalAlignment="Center">
                                <Image Width="64" Height="64" x:Name="ButtonImage" Source="{Binding ImageSource, RelativeSource={RelativeSource TemplatedParent}}"/>
                                <ContentPresenter HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" Margin="{TemplateBinding Padding}" VerticalAlignment="{TemplateBinding VerticalContentAlignment}" RecognizesAccessKey="True" />
                            </StackPanel>
                        </Border>
                    </Grid>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>
использование:
XML
1
<Controls:ImageButton VerticalContentAlignment="Center" ImageSource="/images/1.jpg" Click="ImageButton_Click" Content="click me!"/>
Вложения
Тип файла: rar CustomControl.rar (2.82 Мб, 26 просмотров)
1
7 / 7 / 4
Регистрация: 20.06.2012
Сообщений: 129
Записей в блоге: 4
28.08.2012, 21:31  [ТС] 10
kenny69, ваш вариант работает. Мой сделанный по образу и подобию вашего - нет (кнопки не видно). Может вы могли бы глянуть? Выкладываю архив.
MustDelete.rar
0
burning1ife
1462 / 1284 / 293
Регистрация: 21.09.2008
Сообщений: 3,438
Записей в блоге: 9
28.08.2012, 22:11 11
в app.xaml
XML
1
2
3
4
5
6
7
8
<Application x:Class="MustDelete.App"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             StartupUri="MainWindow.xaml">
    <Application.Resources>
       <ResourceDictionary Source="Controls/ImageButton.xaml"/>
    </Application.Resources>
</Application>
0
7 / 7 / 4
Регистрация: 20.06.2012
Сообщений: 129
Записей в блоге: 4
28.08.2012, 22:59  [ТС] 12
Большое спасибо! Радует, что немного научился использовать Custom control. Скачал шаблон, так что теперь могу добавлять его с помощью Add item...
Завтра попробую сделать Custom control в своем первом примере.
0
burning1ife
1462 / 1284 / 293
Регистрация: 21.09.2008
Сообщений: 3,438
Записей в блоге: 9
29.08.2012, 01:06 13
пожалуйста, рад, что смог помочь )
0
7 / 7 / 4
Регистрация: 20.06.2012
Сообщений: 129
Записей в блоге: 4
30.08.2012, 11:16  [ТС] 14
kenny69, увы не все гладко как хотелось. Делал как у вас в примере, но кое что не получилось - не проходит анимация главного контента окна (та которая должна картинку и текст из-за границы экрана вывести).
Итак XAML код основного окна стал намного короче (это гуд!):
XML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
<Window x:Class="SimpleAnimationApp.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:Controls ="clr-namespace:SimpleAnimationApp.Controls"
        Title="MainWindow" Height="600" Width="800">
    <Grid>
        <DockPanel LastChildFill="True">
            <StackPanel DockPanel.Dock="Bottom" Orientation="Horizontal" Height="80" HorizontalAlignment="Center">
                <Controls:ImageButton ImageSource="/images/api.ico" Click="Button_Click_1"/>
                <Controls:ImageButton ImageSource="/images/database.ico" Click="Button_Click_2"/>
                <Controls:ImageButton ImageSource="/images/float.ico" Click="Button_Click_3"/>
                <Controls:ImageButton ImageSource="/images/Gear.ico" Click="Button_Click_4"/>
                <Controls:ImageButton ImageSource="/images/linux.ico" Click="Button_Click_5"/>
            </StackPanel>
            <Grid x:Name="MyContent" HorizontalAlignment="Center" VerticalAlignment="Center">
                <Grid.RenderTransform>
                    <TransformGroup>
                        <ScaleTransform></ScaleTransform>
                        <RotateTransform></RotateTransform>
                    </TransformGroup>
                </Grid.RenderTransform>
                <Grid.ColumnDefinitions>
                    <ColumnDefinition Width="Auto" />
                    <ColumnDefinition Width="*" />
                </Grid.ColumnDefinitions>
                <Image Name="image" Grid.Column="0" Source="/images/sailor.jpg" Width="300"/>
                <TextBlock Name="text" Margin="20" Grid.Column="1" TextWrapping="Wrap" Width="400"
                           Text="Бла-бла-бла" />
            </Grid>
        </DockPanel>
    </Grid>
</Window>
Большая часть кода перешла в Style.xaml :
XML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
                    xmlns:Controls="clr-namespace:SimpleAnimationApp.Controls">
    <Storyboard x:Key="menuAnimationEnter"> // анимация кнопки когда на нее наводишь мышь
        <DoubleAnimation Storyboard.TargetName="ButtonImage"  Storyboard.TargetProperty="Width" By="20" Duration="0:0:0.5">
            <DoubleAnimation.EasingFunction>
                <BackEase EasingMode="EaseOut" Amplitude="1" />
            </DoubleAnimation.EasingFunction>
        </DoubleAnimation>
        <DoubleAnimation Storyboard.TargetName="ButtonImage" Storyboard.TargetProperty="Height" By="20" Duration="0:0:0.5">
            <DoubleAnimation.EasingFunction>
                <BackEase EasingMode="EaseOut" Amplitude="1" />
            </DoubleAnimation.EasingFunction>
        </DoubleAnimation>
        <DoubleAnimation Storyboard.TargetName="ButtonImage" Storyboard.TargetProperty="Opacity" By="0.5" Duration="0:0:0.5">
            <DoubleAnimation.EasingFunction>
                <BackEase EasingMode="EaseOut" Amplitude="1" />
            </DoubleAnimation.EasingFunction>
        </DoubleAnimation>
    </Storyboard>
    <Storyboard x:Key="menuAnimationExit"> // Анимация когда уводишь мышь
        <DoubleAnimation Storyboard.TargetName="ButtonImage" Storyboard.TargetProperty="Width" Duration="0:0:0.1" />
        <DoubleAnimation Storyboard.TargetName="ButtonImage" Storyboard.TargetProperty="Height" Duration="0:0:0.1" />
        <DoubleAnimation Storyboard.TargetName="ButtonImage" Storyboard.TargetProperty="Opacity" Duration="0:0:0.1" />
    </Storyboard>
    <Storyboard x:Key="elementAnimation"> // анимация главного элемента (картинки и текста)
        <DoubleAnimation Storyboard.TargetName="MyContent" DecelerationRatio="0.9"
                                         Storyboard.TargetProperty="RenderTransform.Children[1].Angle" 
                                         From="70" To="0" Duration="0:0:0.5"/>
        <DoubleAnimation Storyboard.TargetName="MyContent" DecelerationRatio="0.9"
                                         Storyboard.TargetProperty="RenderTransform.Children[0].ScaleX" 
                                         From="0" To="1" Duration="0:0:0.5"/>
        <DoubleAnimation Storyboard.TargetName="MyContent" DecelerationRatio="0.9"
                                         Storyboard.TargetProperty="RenderTransform.Children[0].ScaleY" 
                                         From="0" To="1" Duration="0:0:0.5"/>
    </Storyboard>
    <Style TargetType="{x:Type Controls:ImageButton}">
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="{x:Type Controls:ImageButton}">
                    <Grid x:Name="Grid">
                        <Border x:Name="Background" Background="{TemplateBinding Background}" 
                                BorderBrush="{TemplateBinding BorderBrush}" 
                                BorderThickness="{TemplateBinding BorderThickness}" CornerRadius="3">
                            <StackPanel Orientation="Horizontal" VerticalAlignment="Center" HorizontalAlignment="Center">
                                <Image Width="50" Height="50" x:Name="ButtonImage" Opacity="0.5" 
                                       Source="{Binding ImageSource, 
                                    RelativeSource={RelativeSource TemplatedParent}}"/>
                                <ContentPresenter HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" 
                                                  Margin="{TemplateBinding Padding}" 
                                                  VerticalAlignment="{TemplateBinding VerticalContentAlignment}" 
                                                  RecognizesAccessKey="True" />
                            </StackPanel>
                        </Border>
                    </Grid>
                    <ControlTemplate.Triggers>
                        <EventTrigger RoutedEvent="MouseEnter">
                            <BeginStoryboard Storyboard="{StaticResource menuAnimationEnter}" />
                        </EventTrigger>
                        <EventTrigger RoutedEvent="MouseLeave">
                            <BeginStoryboard Storyboard="{StaticResource menuAnimationExit}" />
                        </EventTrigger>
                        <EventTrigger RoutedEvent="Click"> // Эта анимация вызывает неодработанное исключение
                            <BeginStoryboard Storyboard="{StaticResource elementAnimation}"/>
                        </EventTrigger>
                    </ControlTemplate.Triggers>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>
</ResourceDictionary>
Когда жму кнопку анимированного меню появляется необработанное исключение:
Не удается найти имя "MyContent" в области имен "System.Windows.Controls.ControlTemplate".
Все верно, его там и нету, "MyContent", насколько я понимаю, находится в System.Windows.Controls.Grid
Как можно исправить эту ситуацию?
П.С. выкладываю обновленный архив SimpleAnimationApp.rar
0
burning1ife
1462 / 1284 / 293
Регистрация: 21.09.2008
Сообщений: 3,438
Записей в блоге: 9
30.08.2012, 13:09 15
из ControlTemplate обращаться по имени к внешнему контролу, это ужасно...
для каждой кнопки задавайте анимацию, если она будет обращаться к внешнему контролу по имени.
XML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
 <Grid>
        <Ellipse Fill="LightSteelBlue" Width="100" Height="100" x:Name="elipse"></Ellipse>
        <Button Width="100" Height="30">
            <Button.Triggers>
                <EventTrigger RoutedEvent="Button.Click">
                    <BeginStoryboard >
                        <Storyboard Storyboard.TargetName="elipse"
                                    >
                            <DoubleAnimation   Storyboard.TargetProperty="Width"                                        
                                             By="100"/>
                            <DoubleAnimation     Storyboard.TargetProperty="Height"                                      
                                             By="100"/>
                                
                          
                        </Storyboard>
                    </BeginStoryboard>
                </EventTrigger>
            </Button.Triggers>
        </Button>
    </Grid>
либо сделайте dependency property, для imagecontrol, которое будет содержать ссылку на этот контрол, и сделайте template binding на него, в вашем control template
0
7 / 7 / 4
Регистрация: 20.06.2012
Сообщений: 129
Записей в блоге: 4
30.08.2012, 17:21  [ТС] 16
Цитата Сообщение от kenny69 Посмотреть сообщение
из ControlTemplate обращаться по имени к внешнему контролу, это ужасно...
......
для каждой кнопки задавайте анимацию, если она будет обращаться к внешнему контролу по имени.
.......
либо сделайте dependency property, для imagecontrol, которое будет содержать ссылку на этот контрол, и сделайте template binding на него, в вашем control template
Согласен, некрасиво. Проблема в том, что я пока не зная как красиво.
Добавлять к каждой кнопке анимацию, тоже не очень красиво - много повторяющегося кода. Я как раз этого и хотел избежать когда задавал самый первый вопрос. Попробую вариант с dependency property и отпишусь.

Добавлено через 3 часа 52 минуты
К сожалению не получается. Я понимаю, что должен добавить еще одно dependency property в ImageButton.cs - поле, свойство и обработчик. Но как конкретно его прописать не знаю.
kenny69, может и в этот раз выручите?
0
30.08.2012, 17:21
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
30.08.2012, 17:21
Помогаю со студенческими работами здесь

Как сделать так чтобы в поле Наименование данные выбранные из остальных трех полей собирались в одну строку?
Привет! Есть такой вопрос: В справочнике Сотрудники в реквизитах есть четыре поля: Наименование;...

Добавление данных в app.xaml.cs
В многих книжках читал о создании данных статичных в app.xaml.cs я добавил в свой private...

Сделать из 3х блоков одну кнопку
Добрый день уважаемые гурру. Подскажите пожалуйста как сделать из 3х блоков одну кпонку, пример...

Как подключить стили из App.xaml?
VS 2019 Version 16.4.2. Создаю новый проект из шаблона 'WPF App (.NET Framework)'. В 'App.xaml'...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
16
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru