WPF中切换按钮的代码设计

时间:2013-09-10 13:06:07

标签: wpf togglebutton

我在WPF中切换按钮,当用户点击它时,更改其图标。 什么是最好的设计?单击按钮时,事件处理程序 叫做。然后怎样呢?我应该使用依赖属性吗?

由于

3 个答案:

答案 0 :(得分:7)

您可以使用样式和触发器来完成它。我不知道这是 最好的方式,但它是一个全XAML方法,我喜欢。这是我最近做同样的事情:

<Style x:Key="ZoomToggleButton" TargetType="{x:Type ToggleButton}">
    <Setter Property="Content">
        <Setter.Value>
            <Image Source="/[my assembly];component/Resources/Images/Zoom_Out.png" Width="15" Height="15" Stretch="None" />
        </Setter.Value>
    </Setter>
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type ToggleButton}">
                <Border BorderBrush="{TemplateBinding BorderBrush}" Background="{TemplateBinding Background}" SnapsToDevicePixels="true" CornerRadius="4">
                    <ContentPresenter HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" Margin="{TemplateBinding Padding}" RecognizesAccessKey="True" SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" VerticalAlignment="{TemplateBinding VerticalContentAlignment}"/>
                </Border>
                <ControlTemplate.Triggers>
                    <Trigger Property="IsChecked" Value="true">
                        <Setter Property="Content">
                            <Setter.Value>
                                <Image Source="/[my assembly];component/Resources/Images/Zoom_In.png" Width="15" Height="15" Stretch="None" />
                            </Setter.Value>
                        </Setter>
                    </Trigger>
                </ControlTemplate.Triggers>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

你可能也可以在没有自定义ControlTemplate的情况下通过使用Style.Triggers更改Content属性的值来实现。

答案 1 :(得分:0)

您应该使用样式事件触发器。

制作这样的风格:

<Style TargetType="{x:Type ToggleButton}">
   ...
</Style>

答案 2 :(得分:0)

可以通过样式触发器完成:

<Setter Property="Content">
    <Setter.Value>
        <Image Source="UncheckedImage.png" />
    </Setter.Value>
</Setter>
<Style.Triggers>
    <Trigger Property="IsChecked" Value="True">
        <Setter Property="Content">
            <Setter.Value>
                <Image Source="CheckedImage.png" />
            </Setter.Value>
        </Setter>
    </Trigger>
</Style.Triggers>

请注意,如果您直接设置Content(即XAML中的ToggleButton.Content或C#/ VB中的属性赋值),这将覆盖样式设置器和触发器。

如果需要,您还可以创建具有依赖项属性的自定义控件,以便为此提供更直接的界面。例如:

public class ContentToggleButton : ToggleButton {
    public static readonly DependencyProperty UncheckedContentProperty =
        DependencyProperty.Register("UncheckedContent", typeof(object), typeof(ContentToggleButton));

    public object UncheckedContent {
        get { return GetValue(UncheckedContentProperty); }
        set { SetValue(UncheckedContentProperty, value); }
    }

    public static readonly DependencyProperty CheckedContentProperty =
        DependencyProperty.Register("CheckedContent", typeof(object), typeof(ContentToggleButton));

    public object CheckedContent {
        get { return GetValue(CheckedContentProperty); }
        set { SetValue(CheckedContentProperty, value); }
    }
}

ContentToggleButton的样式:

<Setter Property="Content" Value="{Binding RelativeSource={RelativeSource Mode=Self}, Path=UncheckedContent}" />
<Style.Triggers>
    <Trigger Property="IsChecked" Value="True">
        <Setter Property="Content" Value="{Binding RelativeSource={RelativeSource Mode=Self}, Path=CheckedContent}" />
    </Trigger>
</Style.Triggers>

用法:

<local:ContentToggleButton>
    <local:ContentToggleButton.UncheckedContent>
        <Image Source="UncheckedImage.png" />
    </local:ContentToggleButton.UncheckedContent>
    <local:ContentToggleButton.CheckedContent>
        <Image Source="CheckedImage.png" />
    </local:ContentToggleButton.CheckedContent>
</local:ContentToggleButton>

这还允许您通过这些属性重新分配图像,而不会覆盖触发器。