c# - WPF。双态元素

标签 c# wpf templates controls

我正在实现两个状态元素。我有两个 xaml(用于第一状态和第二状态)。我应该在单击鼠标时更改状态。

我创建自己的 Control child 并使用 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;
            };

        }

    }

但是当我用我的控件运行应用程序时,我得到:“已经添加了具有相同键的项目。”异常?

怎么了。我的方法对吗?

谢谢安德鲁

最佳答案

这绝对不是要走的路。如果您想要一个具有两个独立状态的控件,您应该重新设置 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>

关于c# - WPF。双态元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4260615/

相关文章:

c# - 在生产环境中调试应用程序

c# - Process.Start() 什么时候可以返回 null?

c++ - 模板生成一百个C回调函数,编译不慢

c# - 连续获取方法数据,无需 while

c# - 需要在 Program File 文件夹中写入的 self 更新 .NET 客户端应用程序

wpf - 如何将字体大小绑定(bind)到可变网格大小

wpf - WPF HeaderedItemsControl 中的自动调整 header 大小

wpf - 文本框MVVM内的按键

c++ - 可变参数模板包扩展

python - 如何直接从文件系统加载 jinja 模板