【问题标题】:Hide all Buttons in WPF Application隐藏 WPF 应用程序中的所有按钮
【发布时间】:2016-11-15 09:00:02
【问题描述】:

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

这个问题,怎么办?

我有一个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 中的样式绑定到选项视图。

【问题讨论】:

  • 首先检查您的 VS 输出窗口以搜索失败的绑定。然后启动 Snoop 并检查按钮的 Visibility 属性以查看它是否失败(以红色突出显示)。如果您能找出实际失败的原因,那么您就可以开始提出正确的解决方案了。

标签: c# .net wpf xaml binding


【解决方案1】:

如果您无法直接从绑定中找到复选框,那么带有继承的附加属性将适合您。例如,以下 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 的继承值。

为我工作。希望对您有所帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多