隐藏WPF应用程序中的所有按钮

时间:2016-11-15 09:00:03

标签: c# .net wpf xaml binding

我有一个带有一些视图的WPF C#应用程序(xaml),尤其是一个选项视图。在此视图中,有一个隐藏所有按钮的复选框。

问题,怎么办?

我有一个MainStyle.xaml ResourceDictionary,包含所有样式,转换器等。我的方法是在这个文件中设置一个样式,如:

<Style TargetType="Button">
    <Setter Property="Visibility" Value="Collapsed" />
</Style>

这样可行,但用户应确定按钮是否可见。所以我必须将样式绑定到复选框。

第一步将样式绑定到ResourceDictionary(MainStyle.xaml)后面的代码。但它不起作用。我已将构造函数中的属性设置为false,但按钮是可见的。

MainStyle.xaml

<Style TargetType="Button">
    <Setter Property="Visibility" 
            Value="{Binding ButtonsEnabled, RelativeSource={RelativeSource AncestorType=ResourceDictionary}, Converter={StaticResource BooleanVisibilityConverter}}" />
</Style>

代码背后(MainStyle.xaml.cs)

public partial class BaseStyle : INotifyPropertyChanged
{
    public event PropertyChangedEventHandler PropertyChanged;

    public BaseStyle()
    {
        InitializeComponent();
        ButtonsEnabled = false; // for testing
    }

    private Boolean buttonsEnabled;


    public bool ButtonsEnabled
    {
        get { return buttonsEnabled; }
        set
        {
            buttonsEnabled = value;
            NotifyPropertyChanged("ButtonsEnabled");
        }
    }

    private void NotifyPropertyChanged(string propertyName)
    {
        if (PropertyChanged != null)
            PropertyChanged.Invoke(this, new PropertyChangedEventArgs(propertyName));
    }
}

如果绑定有效,第二步是将ResourceDictionary中的样式绑定到选项视图。

1 个答案:

答案 0 :(得分:0)

如果您无法直接从绑定中找到复选框,那么带有继承的附加属性对您有用。例如,以下XAML:

<UserControl x:Class="WpfSpikes.InheritedAttachPropertyView" x:Name="View"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
             xmlns:local="clr-namespace:WpfSpikes"
             mc:Ignorable="d" 
             d:DesignHeight="300" d:DesignWidth="300">
    <UserControl.Resources>
        <BooleanToVisibilityConverter x:Key="BooleanToVisibilityConverter"/>
        <Style x:Key="VisibleButtonStyle" TargetType="{x:Type Button}">
            <Setter Property="Visibility" Value="{Binding RelativeSource={RelativeSource Self}, Path=(local:ButtonVisibility.IsVisible), Converter={StaticResource BooleanToVisibilityConverter}}"/>
        </Style>
    </UserControl.Resources>
    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition Height="Auto" />
            <RowDefinition Height="Auto" />
            <RowDefinition Height="Auto" />
            <RowDefinition Height="Auto" />
            <RowDefinition Height="Auto" />
        </Grid.RowDefinitions>
        <CheckBox Content="Show Buttons?" IsChecked="{Binding ElementName=View, Path=(local:ButtonVisibility.IsVisible), Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" />
        <Button Grid.Row="1" Content="Button1" Style="{StaticResource VisibleButtonStyle}"/>
        <Button Grid.Row="2" Content="Button2" Style="{StaticResource VisibleButtonStyle}"/>
        <Button Grid.Row="3" Content="Button3" Style="{StaticResource VisibleButtonStyle}"/>
        <Button Grid.Row="4" Content="Button4" Style="{StaticResource VisibleButtonStyle}"/>
    </Grid>
</UserControl>

使用此附加属性:

public static class ButtonVisibility
{
    public static readonly DependencyProperty IsVisibleProperty = DependencyProperty.RegisterAttached("IsVisible", typeof(bool), typeof(ButtonVisibility), new FrameworkPropertyMetadata(true, FrameworkPropertyMetadataOptions.Inherits));

    public static bool GetIsVisible(DependencyObject obj)
    {
        return (bool)obj.GetValue(IsVisibleProperty);
    }

    public static void SetIsVisible(DependencyObject obj, bool value)
    {
        obj.SetValue(IsVisibleProperty, value);
    }
}

控制按钮的可见性。

请注意,附加属性指定FrameworkPropertyMetadataOptions.Inherits,并且组合框在名为View的元素(即顶级用户控件)上绑定到此属性。然后按钮样式在每个单独按钮的级别绑定到此属性(使用RelativeSource={RelativeSource Self}),当按钮位于UserControl中时,它将获取IsVisible的继承值。

适合我。希望它有所帮助。