WPF. Элемент TwoState - PullRequest
       0

WPF. Элемент TwoState

1 голос
/ 23 ноября 2010

Я реализую два элемента состояния.У меня есть два xaml (для первого и второго штата).Я должен изменить состояние при щелчке мыши.

Я создаю собственный дочерний элемент Control и использую xaml

 <Style TargetType="l:ActionButton">
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="l:ActionButton">
                <ContentControl x:Name="LayoutRoot">
                    <ContentControl.Resources>
                        <ControlTemplate x:Key="buttonDownTemplate">
                            <Canvas>.....</Canvas>
                        </ControlTemplate>
                        <ControlTemplate x:Key="buttonUpTemplate">
                            <Canvas>.....<Canvas>            
                       </ControlTemplate>
                    </ContentControl.Resources>
              </ContentControl>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

В OnApplyTemplate я выполняю изменение шаблона

    public override void OnApplyTemplate()
    {
        base.OnApplyTemplate();
        var btn = GetTemplateChild("LayoutRoot") as ContentControl;
        if (btn != null)
        {
            btn.MouseLeftButtonDown += (o, e) =>
            {
                //sample change template
                var template = (ControlTemplate)btn.FindResource("buttonDownTemplate");
                this.Template = template;
            };

        }

    }

Но когда я запускаю приложение со своим контролем, я получаю: "Элемент с таким же ключом уже добавлен. "исключение?

Что не так.Мой путь прав?

Спасибо, Андрей

1 Ответ

4 голосов
/ 23 ноября 2010

Это определенно не тот путь. Если вам нужен элемент управления с двумя отдельными состояниями, вам следует просто изменить стиль ToggleButton. Вы не хотите полностью заменять ControlTemplate, так как это очень медленно. Вместо этого вы должны поместить оба изображения в один и тот же шаблон и показать / скрыть их в зависимости от состояния.

Вот как должен выглядеть стиль для ToggleButton, который выполняет то, что вам нужно (и не требует кода):

<Style x:Key="twoStateButton" TargetType="{x:Type ToggleButton}">
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type ToggleButton}">
                <Grid>
                    <Canvas x:Name="buttonDownTemplate" Background="#202020" Visibility="Collapsed">
                        ...
                    </Canvas>
                    <Canvas x:Name="buttonUpTemplate" Background="#C0C0C0">
                        ...
                    </Canvas>
                </Grid>
                <ControlTemplate.Triggers>
                    <Trigger Property="IsChecked" Value="True">
                        <Setter TargetName="buttonDownTemplate" Property="Visibility" Value="Visible" />
                        <Setter TargetName="buttonUpTemplate" Property="Visibility" Value="Collapsed" />
                    </Trigger>
                </ControlTemplate.Triggers>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...