В WPF должна ли моя пользовательская кнопка с поведением быть расширенной кнопкой, пользовательским элементом управления или просто шаблоном ControlTemplate? - PullRequest
2 голосов
/ 01 марта 2011

У меня есть ControlTemplate для типа Button, который имитирует стиль кнопок панели задач Windows 7. Я могу применить это к стандартному Button, и это выглядит как раз правильно. Для тех, кто не видел Windows 7, кнопки панели задач также имеют поведение ... свечение появляется, когда вы наводите курсор мыши на кнопки, и оно перемещается горизонтально, когда вы наводите на него мышь.

Итак, я повторил это поведение, расширив Button в два этапа; сначала в xaml я использовал Trigger s, чтобы постепенно увеличить Opacity моего 'свечения' RadialGradientBrush, используя событие MouseEnter, и снова уменьшить его, используя событие MouseLeave; затем в коде я реализовал обработчик событий MouseMove, чтобы переместить свойства RadialGradientBrush.GradientOrigin и RadialGradientBrush.Center в текущую позицию мыши. Все мило. Тем не менее, я всегда пытаюсь улучшить свой код, поскольку я узнаю больше о WPF, и мне любопытно несколько вещей.

Хорошо, вот вопросы ...

Во-первых, я знаю, что в WPF нет ничего, что дало бы мне доступ к текущей позиции мыши в xaml, но есть ли что-то, что я могу сделать, чтобы получить это? Под этим я подразумеваю что-то вроде добавления класса ObjectDatProvider в Resources, который выставляет текущую позицию мыши как DependencyProperty, которую я могу напрямую связать со свойствами Center и GradientOrigin RadialGradientBrush.

Я цепляюсь за соломинку здесь ... Цель состоит в том, чтобы удалить код, если это возможно, чтобы я мог просто использовать от ControlTemplate до Style всех Button s в приложении. Или правильно, что это поведение должно быть в коде позади в WPF?

Во-вторых, если действительно лучше использовать код для поведения в моем кастоме Button, то лучше создать CustomControl или оставить его как есть, расширяя Button?

Наконец, если он останется расширенным Button, возможно ли заставить его заменить обычный Button Style? Я думаю о том, как определение Style в Resources с набором свойств TargetType, но без набора x:key, автоматически установит для всех типов Control значение Style .. Можно сказать, что если в приложении есть какие-либо Button, то они должны быть такого типа Button. Опять же, цепляясь за соломинку, но спрашивать нечего.

РЕДАКТИРОВАТЬ >>>

Вот xaml в моем расширенном Button контроле (минус Resources):

<Button.Template>
    <ControlTemplate>
        <Grid MouseMove="Button_MouseMove">
            <Border CornerRadius="3" BorderBrush="#7E000000" BorderThickness="1" Background="#7EFFFFFF">
                <Grid Margin="1">
                    <Rectangle x:Name="BackgroundRectangle" RadiusX="1.5" RadiusY="1.5" StrokeThickness="0" Fill="{StaticResource Windows7Background}" />
                    <Rectangle x:Name="Glow" IsHitTestVisible="False" RadiusX="1.5" RadiusY="1.5" StrokeThickness="0" Opacity="0.0" Fill="{StaticResource GlowBrush}" />
                    <ContentPresenter RecognizesAccessKey="True" ManyManyProperties="{TemplateBinding}"... />
                </Grid>
            </Border>
            <Grid.Triggers>
                <EventTrigger RoutedEvent="MouseEnter">
                    <BeginStoryboard>
                        <Storyboard>
                            <DoubleAnimation Storyboard.TargetName="Glow" Storyboard.TargetProperty="Opacity" From="0.0" To="1.0" Duration="0:0:0.5" DecelerationRatio="1" />
                        </Storyboard>
                    </BeginStoryboard>
                </EventTrigger>
                <EventTrigger RoutedEvent="MouseLeave">
                    <BeginStoryboard>
                        <Storyboard>
                            <DoubleAnimation Storyboard.TargetName="Glow" Storyboard.TargetProperty="Opacity" From="1.0" To="0.0" Duration="0:0:1" DecelerationRatio="1" />
                        </Storyboard>
                    </BeginStoryboard>
                </EventTrigger>
            </Grid.Triggers>
        </Grid>
    </ControlTemplate>
</Button.Template>

Ответы [ 2 ]

2 голосов
/ 01 марта 2011

Задумывались ли вы об использовании прикрепленного поведения / свойства вместо расширения кнопки? Вы, вероятно, использовали вложенные свойства, не зная об этом, такие как Grid.Row и DockPanel.Dock.

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

<Button Content="Button 1" local:Hover.Brush="Red" />

Присоединенное свойство, в основном, является статическим классом с DependencyProperty. В вашем случае он реагирует на события мыши и соответственно устанавливает кисть фона. На самом деле присоединенному свойству даже не нужно заботиться о том, что элемент управления является кнопкой, а просто элементом управления, который имеет доступ к MouseEnter, MouseLeave и MouseMove.

В своем стиле глобальных кнопок вы можете прикрепить свойство следующим образом:

<Setter Property="local:Hover.Brush" Value="Red" />

Вы также можете передать свою радиальную кисть из ресурса, так что если вы хотите изменить цветовую схему, вам не придется менять поведение, только ресурсы.

Подробнее о поведении ...

Прикрепленное поведение - это в основном то же самое. Вы можете увидеть статью Джоша Смита (эксперта по всем вопросам WPF) здесь , чтобы вы могли получить еще лучшее представление о том, что еще можно делать с прикрепленными поведениями / свойствами.


Редактировать: я снова просмотрел ваш пост и понял, что вы хотите изменить не цвет фона, а кисть на блеске. Я постараюсь обновить свой ответ с более подробной информацией в ближайшее время.

0 голосов
/ 07 марта 2011

После прочтения соответствующих глав в книге «Программирование WPF Sells & Griffiths» (отличная книга) я думаю, что теперь могу ответить на свой вопрос. По словам этих ребят, UserControl «призван предложить функциональность, аналогичную пользовательским элементам управления в других инфраструктурах пользовательского интерфейса». Под этим они подразумевают пользовательский элемент управления как невидимую панель, которая содержит набор элементов управления, например, определенной формы. Еще одно замечание: они «обычно не поддерживают настройку с помощью шаблонов».

Что касается CustomControl s, они говорят, что «роль [пользовательского] элемента управления заключается в определении основного поведения ... если требуемое поведение не обеспечивается какими-либо существующими элементами управления, и вы не можете создать его с помощью нескольких элементов управления вместе вам нужно будет написать собственный элемент управления ".

Дальнейший совет заключается в том, что «элемент управления может предоставлять набор визуалов по умолчанию, но он должен позволять заменять их для обеспечения такой же гибкости, как и встроенные элементы управления ... Элемент управления, соответствующий этому подходу, где визуальные элементы отделены от элемента управления, часто описывается как lookless ... Все элементы управления, встроенные в WPF, являются lookless ".

Исходя из этого совета, я думаю, что я создам новый CustomControl для своего 'свечения Button' со значениями по умолчанию ControlTemplate и Style. Таким образом, я смогу изменить стиль Button, но удерживаю светящуюся мышь поверх эффекта.

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